第一章排序(桶排序、冒泡排序、快速排序)

一、桶排序
最快最简单的排序—桶排序
桶的个数M,输入个数规模为N
时间复杂度:O(M+N)
空间复杂度:O(M)
优点:算法思想简单,类似与标记的概念
缺点:空间浪费严重,且对输入的数据范围之类的要求严格
 1 //桶排序
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 void book_sort(int a[], int num,int n)
 5 {
 6     int i,j;
 7     int *b = (int *)malloc(sizeof(int)*n);
 8     for (i = 0;i < n;i++)
 9         b[i] = 0;
10     for (i = 0;i < num;i++)
11     {
12         b[a[i] - 1] = 1;
13     }
14     j = 0;
15     for (i = 0;i < n;i++)
16     {
17         if (b[i])
18         {
19             a[j] = i + 1;
20             j++;
21         }
22     }
23     free(b);
24 }
25 int main()
26 {
27     int  i,n=10;
28     int num = 5;
29     int a[5] = {2,3,5,10,8};
30      
31     book_sort(a,num,n);
32     for (i = 0;i < num;i++)
33         printf("%d ",a[i]);
34      
35     return 0;
36 }
View Code

二、冒泡排序

基本思想:每遍历比较一次,就找出当前的最小值
每次比较相邻的元素,如果它们的顺序错误就把它们交换;每比较一趟,就是将一个数字进行归位;n个数字进行比较,只需比较n-1趟,就能全部进行归位
时间复杂度:O(N*N)
举例说明:将12、35、99、18、76这5个数进行从大到小的排序
               第一趟:比较相邻数字,小的放后面,最终变成35、99、18、76、12,12放在最后面
               第二趟:99、35、76、18、12,18在最后第二位
               第三趟:99、76、35、18、12,35在最后第三位
               第四趟:99、76、35、18、12,76在最后第四位
              剩余的一位即在其合适的位置
   
 1 //冒泡排序
 2 #include <stdio.h>
 3 void bubble_sort(int a[], int n)
 4 {
 5     int i, j, t;
 6     for (i = 1;i < n;i++)
 7     {
 8         for (j = 0;j < n - i;j++)
 9         {
10             if (a[j] > a[j + 1])
11             {
12                 t = a[j];
13                 a[j] = a[j + 1];
14                 a[j + 1] = t;
15             }
16         }
17     }     
18 }
19 int main()
20 {
21     int  i;
22     int num = 5;
23     int a[5] = { 2,3,5,10,8 };
24     bubble_sort(a, num);
25     for (i = 0;i < num;i++)
26         printf("%d ", a[i]);
27 
28     return 0;
29 }
View Code
三、快速排序
桶排序:浪费空间
冒泡排序:浪费时间
快速排序:效率高,空间基本没有影响
基本思想:以某个数为基准,小于基准的数放入左边,大于基准的数放在右边;每实行一次,基准都放在正确的位置;结合了分治与交换的思想
最差时间复杂度:O(N*N)
平均时间复杂度:O(N*logN)
 1 //快速排序
 2 #include <stdio.h>
 3 void quick_sort(int a[],int left,int right)
 4 {
 5     int temp,i=left,j=right,t;
 6     temp = a[left];//划分基准
 7     //跳出程序的条件
 8     if (i > j)
 9         return;
10     while (i != j)
11     {
12         while (i < j&&a[j] >= temp)
13             j--;
14         while (i < j&&a[i] <= temp)
15             i++;
16         if (i < j)
17         {
18             t = a[i];
19             a[i] = a[j];
20             a[j] = t;
21         }
22     }
23     a[left] = a[i];
24     a[i] = temp;
25     quick_sort(a,left,i-1);
26     quick_sort(a,i+1,right);
27 }
28 int main()
29 {
30     int  i;
31     int num = 5;
32     int a[5] = { 2,3,5,10,8 };
33     quick_sort(a,0,num-1);
34     for (i = 0;i < num;i++)
35         printf("%d ", a[i]);
36 
37     return 0;
38 }
View Code
 
四、买书,上述三个排序的应用
标题: 小哼买书
详情: 小哼的学校要建立一个图书角,老师派小哼去找一些同学做调查,看看同学们都喜欢读哪些书。小哼让每个同学写出一个自己最想读的书的ISBN号(你知道吗?每本书都有唯一的ISBN号,不信话你去找本书翻到背面看看)。当然有一些好书会有很多同学都喜欢,这样就会收集到很多重复的ISBN号。小哼需要去掉其中重复的ISBN号,即每个ISBN号只保留一个,也就说同样的书只买一本(学校真是够抠门的)。然后再把这些ISBN号从小到大排序,小哼将按照排序好的ISBN号去书店去买书。请你协助小哼完成“去重”与“排序”的工作。

 

输入格式:
输入有2行,第1行为一个正整数,表示有n个同学参与调查(n<=100)。第2行有n个用空格隔开的正整数,为每本图书的ISBN号(假设图书的ISBN号在1~1000之间)。
输出格式:
输出也是2行,第1行为一个正整数k,表示需要买多少本书。第2行为k个用空格隔开的正整数,为从小到大已排好序的需要购买的图书ISBN号。
提示: 改编自全国青少年信息学奥林匹克联赛(NOIP2006)普及组第一题《明明的随机数》。
限制: 每个测试点1秒
样例:
输入
10
20 40 32 67 40 20 89 300 400 15

输出

8
15 20 32 40 67 89 300 400
   
 1 //桶排序
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 int book_sort(int a[], int num,int n)
 5 {
 6     int i,j;
 7     int *b = (int *)malloc(sizeof(int)*n);
 8     for (i = 0;i < n;i++)
 9         b[i] = 0;
10     for (i = 0;i < num;i++)
11     {
12         b[a[i] - 1] = 1;
13     }
14     j = 0;
15     for (i = 0;i < n;i++)
16     {
17         if (b[i])
18         {
19             a[j] = i + 1;
20             j++;
21         }
22     }
23     free(b);
24     return j;
25 }
26 int main()
27 {
28     int  i,n=10;
29     int num = 5;
30     int m;
31     int a[5] = {2,3,5,10,3};
32      
33     m=book_sort(a,num,n);
34     for (i = 0;i < m;i++)
35         printf("%d ",a[i]);
36      
37     return 0;
38 }
View Code
 1 //冒泡排序
 2 #include <stdio.h>
 3 void bubble_sort(int a[], int n)
 4 {
 5     int i, j, t;
 6     for (i = 1;i < n;i++)
 7     {
 8         for (j = 0;j < n - i;j++)
 9         {
10             if (a[j] > a[j + 1])
11             {
12                 t = a[j];
13                 a[j] = a[j + 1];
14                 a[j + 1] = t;
15             }
16         }
17     }     
18 }
19 int delete_sort(int a[], int n)
20 {
21     int i=0, j=1;
22     while (j < n)
23     {
24         if (a[i] != a[j])
25         {
26             a[++i] = a[j];
27             j++;
28         }
29         else
30         {
31             j++;
32         }
33     }
34     return i+1;
35 }
36 int main()
37 {
38     int  i,m;
39     int num = 5;
40     int a[5] = { 2,3,5,10,3};
41     bubble_sort(a, num);
42     m=delete_sort(a,num);
43     for (i = 0;i < m;i++)
44         printf("%d ", a[i]);
45 
46     return 0;
47 }
View Code
 1 //快速排序
 2 #include <stdio.h>
 3 void quick_sort(int a[],int left,int right)
 4 {
 5     int temp,i=left,j=right,t;
 6     temp = a[left];//划分基准
 7     //跳出程序的条件
 8     if (i > j)
 9         return;
10     while (i != j)
11     {
12         while (i < j&&a[j] >= temp)
13             j--;
14         while (i < j&&a[i] <= temp)
15             i++;
16         if (i < j)
17         {
18             t = a[i];
19             a[i] = a[j];
20             a[j] = t;
21         }
22     }
23     a[left] = a[i];
24     a[i] = temp;
25     quick_sort(a,left,i-1);
26     quick_sort(a,i+1,right);
27 }
28 int delete_sort(int a[], int n)
29 {
30     int i = 0, j = 1;
31     while (j < n)
32     {
33         if (a[i] != a[j])
34         {
35             a[++i] = a[j];
36             j++;
37         }
38         else
39         {
40             j++;
41         }
42     }
43     return i + 1;
44 }
45 int main()
46 {
47     int  i,m;
48     int num = 5;
49     int a[5] = { 2,3,5,10,3 };
50     quick_sort(a,0,num-1);
51     m = delete_sort(a, num);
52     for (i = 0;i < m;i++)
53         printf("%d ", a[i]);
54 
55     return 0;
56 }
View Code

 

posted @ 2017-05-24 12:46  daisy_ding  阅读(324)  评论(0)    收藏  举报