第一章排序(桶排序、冒泡排序、快速排序)
一、桶排序
最快最简单的排序—桶排序
桶的个数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 }
二、冒泡排序
基本思想:每遍历比较一次,就找出当前的最小值
每次比较相邻的元素,如果它们的顺序错误就把它们交换;每比较一趟,就是将一个数字进行归位;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 }
三、快速排序
桶排序:浪费空间
冒泡排序:浪费时间
快速排序:效率高,空间基本没有影响
基本思想:以某个数为基准,小于基准的数放入左边,大于基准的数放在右边;每实行一次,基准都放在正确的位置;结合了分治与交换的思想
最差时间复杂度: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 }
四、买书,上述三个排序的应用
| 标题: | 小哼买书 | ||
| 详情: | 小哼的学校要建立一个图书角,老师派小哼去找一些同学做调查,看看同学们都喜欢读哪些书。小哼让每个同学写出一个自己最想读的书的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秒 | ||
| 样例: |
|
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 }
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 }
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 }

浙公网安备 33010602011771号