排序算法 之 一

  摸着良心写博客, 之前写的微博, 内容精华不少, 但是我要添加一些走心的干货!

  就从最基本的排序算法开始吧!

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 }
 
原文地址:https://www.cnblogs.com/guangleijia/p/5163335.html