算法学习~分治法~快速排序

天天都在排序。。简直就是要给这个混乱的世界一个正确的秩序。。不过嘛。排序也有快慢之分,

冒泡排序法,,思路很简单就是一个个上去打擂台,,这样的时间复杂度很糟糕,,O(N^2)中O是一个常数,O(N^2)是指最大上限(估值)n(n-1)/2 = (n^2 - n)/2最高位估值仍为n^2两种情况是一样的。

选择排序法,,每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最前(最后),直到全部待排序的数据元素排完。选择排序是不稳定的排序方时间复杂度为O(n),最坏情况下仍为O(n^2)。

排序比较好的还有这种logn级别的排序法,

先上代码,,个位可以先瞅瞅,。一般第一次不会很明白。。下面有解释。。

 1 //快速排序
 2 #include<stdio.h>
 3 int main()
 4 {   void quick_sort(int s[], int l, int r);
 5     int a[10001],i,x;
 6    while(~scanf("%d",&x))
 7    {  for(i=0;i<x;i++)
 8         scanf("%d",&a[i]);
 9      quick_sort(a,0,x-1);//第一个参数是数组地址,然后是需要排序的区间,i就是长度
10    for(i=0;i<x;i++)
11     {
12        printf("%d ",a[i]);//再顺序输出
13     }
14     printf("\n");
15    }
16 }
17 void quick_sort(int s[], int l, int r)//返回调整后基准数的位置
18 {
19     if (l < r)//只要是满足起点小于终点
20     {
21         //Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1
22         int i = l, j = r, x = s[l];//赋予初始值,i就是起点j就是终点 //s[l]就是当前的值
23         while (i<j)
24         {
25             while(i<j&&s[j]>=x) // 从右向左找第一个小于x、起点的数
26                 j--;//找到第一个小于的就会跳出循环j的值就是当前小于的那个
27             if(i<j)
28                 s[i++]=s[j];//将s[j]填到s[i]中,s[j]就形成了一个新的坑,i++
29             while(i<j&&s[i]<x) // 从左向右找第一个大于等于x的数
30                 i++;
31             if(i<j)
32                 s[j--]=s[i];//
33         }
34         s[i] = x;//退出时,i等于j。将x填到这个坑中。
35         quick_sort(s,l,i-1); //递归调用前半段和后半段。
36         quick_sort(s,i+1,r);
37      }
38 }

 

posted on 2015-02-28 11:04  陆熠十四  阅读(2747)  评论(0编辑  收藏  举报

导航