快速排序
我用自己的语言来阐述快速排序.希望没有基础的人也能看懂.
快速排序的主要是思想是:
1.找个参考数,把比它大的数放到右边,比它小的数放到左边;
2.递归
关于找参考数,没有比较死的规定,一般取第一个,也可以取其它的,比如中间的数.
代码如下,注释比较详细.
代码:
#include<stdio.h> #include<stdlib.h> void q_sort(int a[], int startIndex, int endIndex); int main(int argc, char **argv) { int i; int a[] = {3,1,4,7,11,2}; printf("排序之前:\n"); for(i = 0; i < 6; ++i) { printf("%d ", a[i]); } printf("\n"); q_sort(a, 0, 5); printf("排序之后:\n"); for(i = 0; i < 6; ++i) { printf("%d ", a[i]); } printf("\n"); exit(0); } void q_sort(int a[], int startIndex, int endIndex) { int midOne = a[startIndex];//选第一个作为参考点 int i = startIndex, j = endIndex; if(i < j)//这个判断是递归结束的依据,不加的话会导致堆栈溢出 { while(i < j) { for(; i < j; j--) if(a[j] < midOne)//小于参考点的数移到左边 { a[i++] = a[j]; break; } for(; i < j; i++) if(a[i] > midOne)//大于参考点的数移到右边 { a[j--] = a[i]; break; } } a[i] = midOne;//参考点归位 //把参考点左右的部分分别进行快排 q_sort(a, startIndex, i - 1); q_sort(a, i + 1, endIndex); } }
输出结果:
排序之前: 3 1 4 7 11 2 排序之后: 1 2 3 4 7 11
快速排序的时间复杂度:平均O(n*log(n)),最坏O(n^2);
快速排序的空间复杂度:平均O(logn),最坏O(n)