首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

快速排序的疑惑!该如何处理

2012-02-24 
快速排序的疑惑!我自己按照快速排序的意思写了个程序,确实可以拍。可是很多范例的做法跟我的有点不一样。#in

快速排序的疑惑!
我自己按照快速排序的意思   写了个程序,确实可以拍。     可是很多范例的做法跟我的有点不   一样。
#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]的单向移动,直至一趟排序结束后再将枢轴记录移至正确位置上.
这样可以减少记录的移动操作

热点排行