通过一组排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,最终使所有数据变成有序序列。
找一个记录,以它的关键字作为“枢轴”,凡其关键字小于枢轴的记录均移动至该记录之前,反之,凡关键字大于枢轴的记录均移动至该记录之后。致使一次划分之后,记录的无序序列R[s…t]将分割成两部分:
R[s…i-1]和R[i+1…t],
且 R[j].key≤ R[i].key ≤ R[j].key(s≤j≤i-1)枢轴(i+1≤j≤t)。
例 {57,49,80,36,14,58,61,97,23,75} ;
将57作为枢轴,进行快速排序,将小于57的数字排在左边,大于57的排在57右边
#include<iostream>
using namespace std;
#define MAX 50
void qsort(int arry[],int low,int high);
int main()
{
int a[MAX];//输入数组
int num=0;
cout<<"默认第一个数字为枢轴~"<<endl;
while(cin>>a[num])
{
num++;
if(cin.peek()=='\n') break;
}
int arry[num];//运算数组
for(int i=0;i<num;i++)
{
arry[i]=a[i];
}
qsort(arry,0,num-1);
for(int i=0;i<num;i++)
{
cout<<arry[i]<<" ";
}
return 0;
}
void qsort(int arry[],int low,int high)
{
if(high<low) return;
int i=low;
int j=high+1;
int simple=arry[0];
while(true)
{
while(arry[++i]<simple)
{
if(i==high)
{
break;
}
}
while(arry[--j]>simple)
{
if(j==low)
break;
}
if(i>=j) break;
int tmp=arry[i];
arry[i]=arry[j];
arry[j]=tmp;
}
int tmp=arry[low];
arry[low]=arry[j];
arry[j]=tmp;
qsort(arry,low,j-1);
qsort(arry,j+1,high);
}
比较蠢,输入时用了两个数组比较麻烦
算法方面就是利用递归来调用自身,每一次移动low位+1,high-1
递归会比较方便,非递归不会写!