算法思想:
将一个长度为n(n>0)的数组进行从小到大的顺序排列。快速排序首先需要在该数组中找任意一个元素出来作为比较基准(pivot),这里假设找的pivot为当前数组的最后一个元素,即 arr[n-1],那么接下来在arr[0] - arr[n -2]这个数组中,我要将它们分为2大类(即2个子数组),第一个数组要确保所有元素比pivot要小或者等于pivot,第二个数组中的所有元素要确保比pivot大,做好这样一件事情之后,再将pivot元素插入到 子数组1和子数组2的中间,这样一轮就保证了 pivot所在的位置一定是最终排序后的位置,因为它左边的所有元素都已经比它小或等于它了,它右边的所有元素都已经比它大了。再利用分治的思想,对于左边的子数组和右边的子数组再将这样的方法进行下去直到当前arr的len = 1或者 0,这就是快速排序的思想。
快速排序的最理想时间复杂度为O(nlgn),平均时间复杂度也是O(nlgn);最坏时间复杂度是O(n^2),这里最坏的情况就是选择的pivot那个元素在该数组的最左边或最右边。快速排序是一个不稳定的排序算法。
代码:
#include <iostream>
#include <stdlib.h>
using namespace std;
void swap(int arr[], int i, int j){
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
void quickSort(int arr[],int len){
if (len <= 1)
return;
int right = len - 2;
int left = 0;
int pivot = len - 1;
while (left <= right){
while (arr[left] <= arr[pivot]){
//从左到右遍历查找,直到找到一个比arr[pivot]大的
++left;
if (left == pivot)
break;
}
while (arr[right] > arr[pivot]){
--right;
if (right < 0)
break;
}
if (left <= right){
swap(arr, left, right);
}
else {
swap(arr, left, pivot);
//这里已经能够确保,pivot左边的子数组中的任何元素比它都小或者等于它,右边的子数组任何元素都比它大
//这里分别对它目前左边和右边的子数组进行递归分治
quickSort(arr, left);
quickSort(arr + left + 1, len - left - 1);
}
}
}
int main(){
int arr[] = { 7, 4, 9, 2, 8, 6, 1, 5, 3, 0 };
int len = sizeof(arr) / sizeof(arr[0]);
quickSort(arr, len);
for (int i = 0; i < len; ++i){
cout << arr[i] << endl;
}
system("pause");
return 0;
}