快速排序是原地排序,其最坏运行时间为O(n^2),但是其期望运行时间为O(nlgn)。
快速排序是一种递归调用,其原理为:在排序的数组中选择一个关键字key=A[i],然后将数组划分为两组A[1,2...p-1],A[p+1,......q],其中A[p]=key。之后再对A[1,2...p-1],A[p+1,......q]递归调用。
实现过程1(升序)
下面实现是1从右向左找小于关键字的数的位置,找到之后把它放到关键字的位置,2之后从左向右找大于关键字的数,找到之后放到1中大于关键字的那个位置3如果没遍历完数组,重复1、2
QuickSort(A,p,r)
if p<r
key←A[p]
low←p
right←r
while low<high
while low<high and key<A[high] //从右向左找小于关键字key的数
do high←high-1
v[low]←v[high]
while low<high and key>=v[low] //从左往右找大于关键字key的数
low←low+1
v[high]←v[low]
v[low]=key//关键字key的最终位置
QuickSort(A,p,low-1)//递归调用
QuickSort(A,low+1,r)
#include<iostream>
#include <vector>
using namespace std;
int main()
{
void quitsort(vector<int> &v,int low,int high);
vector<int> test;
for (int i=0;i<10;i++)
{
int k;
cin>>k;
test.push_back(k);
}
quitsort(test,0,9);
for(vector<int>::iterator it=test.begin();it!=test.end();it++)
{
cout<<*it<<' ';
}
return 0;
}
void quitsort(vector<int> &v,int low,int high)
{
if(low<high)
{
int key=v[low];
int left=low,right=high;
while (low<high)
{
while(low<high&&key<v[high])//从右往左找小于关键字key的数
{
high--;
}
v[low]=v[high];
while (low<high&&key>=v[low])//从左往右找大于关键字key的数
{
low++;
}
v[high]=v[low];
}
v[low]=key;
quitsort(v,left,low-1);//递归调用
quitsort(v,low+1,right);
}
}
另一种实现是:
QuickSort(A,p,r)
if p<r
then q←Partition(A,p,r)
QuickSort(A,p,q-1)
QuickSort(A,q+1,r)
其中Partition(A,p,r)是对数组原地重排
Partition(A,p,r)
key←A[r]
i←p-1
for j← p to r-1
do if A[j]<=key
then i←i+1
exchange A[i]↔A[j]
exchange A[i+1]↔A[r]
return i+1
其中i用来分界,A[i]<key,A[i+1}>=key,即i左边的数都小于key。j用来遍历