快排的思路:
快排属于:挖坑填数+分治法”,首先令i =L; j = R; 将a[i]挖出形成第一个坑,称a[i]为基准数。然后j–由后向前找比基准数小的数,找到后挖出此数填入前一个坑a[i]中,再i++由前向后找比基准数大的数,找到后也挖出此数填到前一个坑a[j]中。重复进行这种“挖坑填数”直到i==j。再将基准数填入a[i]中,这样i之前的数都比基准数小,i之后的数都比基准数大。因此将数组分成二部分再分别重复上述步骤就完成了排序。
快排的复杂度:
快排的复杂度是:O(n*ln[n]);具体求解步骤可以参考以下这篇文章。
添加链接描述
代码:
#include "stdafx.h"
#include<iostream>
#include<vector>
using namespace std;
void quickSort(vector<int> &num, int l, int r);
int _tmain(int argc, _TCHAR* argv[])
{
int k;
int array[] = {3, 23, 26, 45, 56, 12, 48, 56, 45, 11, 98, 45, 632, 6484, 641, 315, 111};
int len = sizeof(array) / sizeof(int);
vector<int> num(array, array + len);
cout << "排序之前:" << endl;
for (k = 0; k < num.size(); k++)
cout << num[k]<<",";
cout << endl;
quickSort(num, 0, len - 1);
cout << "排序之后:" << endl;
for (k = 0; k < num.size(); k++)
cout << num[k] << ",";
cout << endl;
system("pause");
return 0;
}
void quickSort(vector<int> &num, int l, int r){
if (l >= r) //先检查左右条件
return;
int i = l, j = r, x = num[l];
while (i < j) {
while (i < j && num[j] >= x)//从右向左找到第一个小于x的值
j--;
if (i < j)
num[i++] = num[j];//填坑之后i++
while (i < j && num[i] <= x)//从左向右找第一个大于x的值
i++;
if (i < j)
num[j--] = num[i];//填坑之后j--
}
num[i] = x; //把选中的x放到i处
quickSort(num, l, i - 1);//以i为中间值,分左右两部分递归调用
quickSort(num, i + 1, r);
}
运行结果: