快速排序的疑惑!
我自己按照快速排序的意思 写了个程序,确实可以拍。 可是很多范例的做法跟我的有点不 一样。
#include <iostream>
using namespace std;
int partition(int a[],int left,int right)
{
int i=left;
int j=right;
int pivot=a[left];//基准数
int temp=0;
while(i <j)
{
while(i <j)
{
if(a[j] <pivot)
{
temp=a[i]; a[i]=a[j]; a[j]=temp;
break;
}
j--;
}
while(i <j)
{
if(a[i]> pivot)
{
temp=a[j]; a[j]=a[i]; a[i]=temp;
break;
}
i++;
}
}
//a[j]=pivot; 很多范例程序都在此画蛇添足的把基准值 给a[j] 我没有这句 一样可以排好。
return j;//任意返回i j均可
}
void quicksort(int a[],int left,int right)
{
if(left> right)
{
return;
}
int p=partition(a,left,right);
quicksort(a,left,p-1);
quicksort(a,p+1,right);
}
int main(int argc, char* argv[])
{
int a[]={15,45,78,94,1,54,10,12,48,22,14,61};
quicksort(a,0,11);
for(int i=0;i <12;i++)
{
//cout < <a[i] < <endl;
}
return 0;
}
[解决办法]
我所见到的范例:
void qsort(int a[],int s,int t)
{
int i=s,j=t,x=a[s];//基准数
while(i <j)
{
while(i <j&&a[j]> =x)j--; //从右边寻找比基准小的元素
if(i <j)a[i]=a[j]; //直接赋值到左边
while(i <j&&a[i] <=x)i++; //从左边寻找比基准大的数
if(i <j)a[j]=a[i]; //直接赋值到右边
}
a[i]=x; //基准数定位
if(s <i-1)qsort(a,s,i-1);
if(j+1 <t)qsort(a,j+1,t);
}
范例的快排没有交换两个元素的值,而是直接赋值(这样基准会被覆盖)
如果要交换的话可以在取序列中间的元素作为基准,在它的左右区间寻找逆序的数进行交换
[解决办法]
因为先将枢轴记录暂存在i中,排序过程中只作a[low]或a[high]的单向移动,直至一趟排序结束后再将枢轴记录移至正确位置上.
这样可以减少记录的移动操作