快速排序介绍
- 快速排序:快
- 快速排序思路:
取一个元素p(第一个元素),使元素p归位(调用partition函数),归位后列表左边都是比p小的元素,右边都是比p大的元素(升序时);
列表被p分为两部分,左边都比p小,右边都比p大;
递归完成排序。
- 快速排序的效率:
时间复杂度:O(nlogn)
- 快速排序的问题
最坏情况:O(n^2),可能性非常小
递归
#include<stdio.h> void Print(int li[], int n) { int i = 0; for (i = 0; i < n; i++) { printf("%d ", li[i]); } printf("\n"); } int partition(int li[], int left, int right) { //int n = right + 1; //Print(li, n);//验证 int tmp = li[left]; while (left < right) { while (left < right && li[right] >= tmp)// 从右边找比tmp小的数 { right--;// 往前走一步 } li[left] = li[right];// 来到这里,left==right或者li[right]<tmp,把右边的值写到左边空位上 //Print(li, n);//验证 while (left < right && li[left] <= tmp)// 从左边边找比tmp大的数 { left++;// 往后走一步 } li[right] = li[left];// 把左边的值写到右边空位上 //Print(li, n);//验证 } li[left] = tmp;// 把tmp归位 //Print(li, n);//验证 return left;// return right也一样 } void quick_sort(int li[], int left, int right) { if (left < right)// 至少两个元素 { int mid = partition(li, left, right); quick_sort(li, left, mid - 1); quick_sort(li, mid + 1, right); } } int main() { int li[] = { 5,7,4,6,3,1,2,9,8 }; int n = sizeof(li) / sizeof(li[0]); int left = 0; int right = n - 1; quick_sort(li, left, right); Print(li, n);//验证 //quick_sort(li, n, left, right); return 0; }
09-18
1248
09-19
1008
09-15
342
09-19
1150