快速排序(Quick Sort)算法
基本思想:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。
#include<iostream>
#include<vector>
using namespace std;
//交换input中子表的记录,使枢轴记录到位,并返回其所在位置值
//此时在它之前(后)的记录均不大(小)于它
int partition(vector<int> &input, int begin, int end)
{
int low = begin;
int high = end;
int pivot = input[low]; //用子表的第一个记录作枢轴记录
//优化选取枢轴,随机法,三数取中(左中右,排序交换),九数取中
//随机法如下:
//int pivot=input[RandInRange(begin,end)];
while (low < high) //从表的两边交替向中间扫描
{
while (low < high&&pivot <= input[high])
high--;
swap(input[low], input[high]); //优化不必要的交换,直接用赋值input[low] = input[high];
while (low < high&&pivot >= input[low]) //得结合具体例子分析,大话数据结构上面有
low++;
swap(input[low], input[high]); //优化不必要的交换,直接用赋值input[high] = input[low];
} //得结合具体例子分析,大话数据结构上面有
//input[low] = pivot;
return low; //返回枢轴位置 注:如果是swap,此句就不需要
}
/*
int RandInRange(int a, int b) //产生一个[a,b]范围内的随机整数
{
int c;
c = a + rand() % (b - a + 1);
return c;
}
*/
vector<int> Qsort(vector<int> &input, int start, int end)
{
if (start<end)
{
int pivot = partition(input, start, end); //将input[start......end]一分为二
//算出枢轴值pivot
Qsort(input, start, pivot - 1); //对高子表递归排序
Qsort(input, pivot + 1, end); //对低子表进行递归排序
}
return input;
}
vector<int> QuikSort(vector<int> input)
{
vector<int> output;
int length = input.size();
output=Qsort(input,0,length-1);
return output;
}
int main()
{
vector<int> input,output;
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
int number;
cin >> number;
input.push_back(number);
}
output=QuikSort(input);
vector<int>::iterator it;
for (it = output.begin(); it != output.end(); it++)
{
cout << *it << " ";
}
system("pause");
}