1.问题描述
快速排序。
2.问题分析
快速排序的思路:
1、找一个基准数,例如序列最左侧数字,两个哨兵i,j分别从序列左,右两端开始探索
2、当j遇到比基准数字小的数字则停下
3、当i遇到比基准数字大的数字则停下
4、交换位置为i,j的数字
5、当i,j相遇之后,将基准数字与位置为i的数字交换
6、递归对位置i两侧的字序列排序
3.代码
#include "stdlib.h"
#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;
void quickSort(int left, int right, vector<int>& arr)
{
if(left >= right)
return;
int i, j, base, temp;
i = left, j = right;
base = arr[left];//取最左边的数为基准数
while(i < j)
{
while(arr[j] >= base && i < j)
j--;
while(arr[i] <= base && i < j)
i++;
if(i < j)
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
arr[left] = arr[i];
arr[i] = base;
quickSort(left, i-1, arr);
quickSort(i+1, right, arr);
}
int main(int argc, char* argv[])
{
vector<int> arr = {2,1,3,2,6,4,5};
quickSort(0, 6,arr);
for(int i = 0; i < arr.size(); ++i)
cout << arr[i] << endl;
system("pause");
return 0;
}
4.总结
本题的关键在于理解快排的思想。