算法学习~分治法~快速排序
天天都在排序。。简直就是要给这个混乱的世界一个正确的秩序。。不过嘛。排序也有快慢之分,
冒泡排序法,,思路很简单就是一个个上去打擂台,,这样的时间复杂度很糟糕,,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 }