摸着良心写博客, 之前写的微博, 内容精华不少, 但是我要添加一些走心的干货!
就从最基本的排序算法开始吧!
1. 桶排序
有 5 个同学,这 5 个同学分别考了 5 分、3 分、 5 分、2 分和 8 分,(满分是 10 分)。接下来将分数进行从大到小排序, 排序后是 8 5 5 3 2。
1 int main() 2 { 3 int a[11],i,j,t; 4 for(i=0;i<=10;i++) 5 a[i]=0; //初始化为0 6 7 for(i=1;i<=5;i++) //循环读入5个数 8 { 9 scanf("%d",&t); //把每一个数读到变量t中 10 a[t]++; //进行计数 11 } 12 13 for(i=0;i<=10;i++) //依次判断a[0]~a[10] for(j=1;j<=a[i];j++) //出现了几次就打印几次 14 printf("%d ",i); 15 getchar();getchar(); //这里的getchar();用来暂停程序,以便查看程序输出的内容 //也可以用system("pause");等来代替 16 return 0; 17 }
2. 冒泡排序
冒泡排序的基本思想是:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来。 冒泡排序的核心部分是双重嵌套循环。不难看出冒泡排序的时间复杂度是
O(N2)。这是 一个非常高的时间复杂度。
1 // 2. 冒泡排序 2 int score[6] = {2, 5, 7, 3, 1, 2}; 3 4 for (int i = 0; i < 6; i++) { 5 for (int j = 0; j < 6 - i; j++) { 6 7 float temp = 0; 8 if (score[j] > score[j+1]) { // 从小到大 9 temp = score[j]; 10 score[j] = score[j+1]; 11 score[j+1] = temp; 12 } 13 } 14 } 15 16 17 for (int i = 0; i < 6; i++) { 18 printf("score - %d ", score[i]); 19 }
3. 快速排序法
快速排序的最差时间复杂度和 冒泡排序是一样的,都是 O(N2),它的平均时间复杂度为 O (NlogN)。

1 int n; // 定义全局变量 2 int a[10] = {6, 5, 7, 3, 1, 8, 9, 10, 2, 4}; 3 4 void quickSort(int left, int right){ 5 // 3. 快速排序法 6 int i, j, t, temp; 7 8 if (left > right) { 9 return ; 10 } 11 12 temp = a[left]; // temp存储基准数 13 i = left; 14 j = right; 15 16 while (i != j) { 17 // 顺序很重要, 要从右往左找 18 while (a[j] >= temp && i < j) { 19 j--; 20 } 21 22 // 从左往右找 23 while (a[i] <= temp && i < j) { 24 i++; 25 } 26 27 // 交换两个数在数组中的位置 28 if(i < j){ // 在哨兵没有相遇时 29 t = a[i]; 30 a[i] = a[j]; 31 a[j] = t; 32 } 33 } 34 35 // 最终基数归位 36 a[left] = a[i]; 37 a[i] = temp; 38 39 quickSort(left, i-1); // 继续处理左边的, 递归 40 quickSort(i + 1, right); // 继续处理右边的, 递归 41 } 42 43 int main(int argc, const char * argv[]) { 44 @autoreleasepool { 45 // insert code here... 46 NSLog(@"Hello, World!"); 47 48 49 50 quickSort(1, 10); 51 52 for (int i = 0; i < 10; i++) { 53 printf("%d ", a[i]); 54 } 55 56 getchar();getchar(); 57 }