都是两种效率高而且常用的排序方法,今天来总结下。
先说快排:
首先,快速排序的时间复杂度为nlogn,其思想实质为分治法。而这分治法的基本思想为以下三点:
1.先从数列中取出一个基准数。
2.在分治的过程中,比这个基准数小的数全部放到这个基准数的左边,反之则放到右边。
3.然后再对由第二步产生的两个区间再进行第二步的操作,当分出来的区间仅剩一个数为止。
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> #define maxn 1000000 int a[maxn]; void qs(int a[],int l,int r) { if(l < r) { int i=l, j=r, x=a[l]; while(i < j) { while(i<j && a[j] >= x) j--; if(i < j) a[i++] = a[j]; while(i<j && a[i] < x) i++; if(i < j) a[j--] = a[i]; } a[i] = x; qs(a,l,i-1); qs(a,i+1,r); } } void print(int a[],int n) { for(int i=0; i<n; i++) printf("%d ",a[i]); printf("\n"); } int main() { int n,i; while(scanf("%d",&n) == 1) { srand(time(0)); for(i=0; i<n; i++) a[i] = rand()%100; qs(a,0,n-1); print(a,n); } return 0; }