一、 快速排序递归实现
快速排序应该是数据结构中比较基础也用的最广泛的的排序了,以下是它的递归实现。
int QKpass(int left,int right)
{
int k;
int low=left,high=right;
k=data[low];
while(low<high)
{
while(low<high&&data[high]>k)
high--;
if(low<high)
{
data[low]=data[high];
low++;
}
while(low<high&&data[low]<k)
low++;
if(low<high)
{
data[high]=data[low];
high--;
}
}
data[low]=k;
return low;
}
void QKsort(int low,int high)
{
if(low<high)
{
int k=QKpass(low,high);
QKsort(low,k-1);
QKsort(k+1,high);
}
}
二、 快速排序非递归实现
另外在实际应用中递归调用的代价比较高,对快速排序的过程进行一下思考,快排每次总是对前面的部分处理,若前面的部分有序了然后再处理
后面的部分,过程如下图(图是自己画的,将就着看,呵呵),图中标明了递归快速排序的顺序。假设每次划分我们可以得到一个1:1的划分,我们只
需要将打箭头的元素保存起来,每当要划分的元素集小于2的时候就将打箭头的元素弹栈对后半部分的元素进行处理。
以下是一个快速排序的非递归版本:
#include<iostream>
#include <vector>
using namespace std;
inline void swap(int *DATA,int x,int y)
{
//DATA[x]=DATA[x]^DATA[y];
//DATA[y]=DATA[x]^DATA[y];
//DATA[x]=DATA[x]^DATA[y];
int temp;
temp=DATA[x];
DATA[x]=DATA[y];
DATA[y]=temp;
}
int Pation(int *DATA,int low,int high)
{
if(high>low)
{
int i;
i=low-1;
for(int k=low;k<high;k++)
{
if(DATA[k]<DATA[high])
{
i++;
swap(DATA,i,k);
}
}
swap(DATA,i+1,high);
return i+1;
}
else
return high;
}
void QuickSort(int *DATA,int beg,int end)
{
vector<int> vec(10);
int low=beg;
int high=end;
int k;
vec.push_back(high);
while(1)
{
k=Pation(DATA,low,high);
if(k==end)
break;
while(k>low)
{
vec.push_back(k);
k=Pation(DATA,low,k-1);
}
low=k+1;
if(vec.size()==0)
high=end;
else
{
high=vec.back();
vec.pop_back();
}
}
}
int main()
{
int a[]={6,11,2,7,17,1,5,4,2,8,9,5,23,4,5,15,7,15};
QuickSort(a,0,17);
for(int i=0;i<17;i++)
cout<<a[i]<<" ";
getchar();
}