首页 > 代码库 > 快速算法的两个实现方法

快速算法的两个实现方法

今天调试了快速算法的代码,当然网上这样的代码一大堆,只是这个是自己一点点写的,中间易错点都出现并调试出来。留着以后自己复习用了。

交换代码:

void sw(int *a,int *b)//交换数据
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}

实现方法1:

////由大到小排序

void sort(int a[],int low,int high)
{

if(low>=high)/////递归出口
return;
int key=a[low];////
int first=low;
int last=high;
while(low<high)
{
  if(a[low]<=key && a[high]>key && low<high)
  {
    sw(&a[low],&a[high]);
    low++;
    high--;
  }
  while(a[low]>key&&low<high)
    low++;
  while(a[high]<=key&&low<high)
  high--;
}

////注意:一定要搞清楚递归调用的第二个和第三个参数!first和last保存了初始数组的第一个和最后一变量地址,low和high是两个变量。

////在low>high是才跳出上面的while循环。故分割数组,第一部分是first到high,第二部分是low到last

if (high>1)
  sort(a,first,high);
if(first<high)
  sort(a,low,last);

}

第二种方法:

//此算法不是很好理解,特别是它的交换操作.

void Qsort(int a[],int low,int high)
{
/////由小到大排序
  if(low>=high)
  {
    return;
  }
  int first = low;
  int last = high;
  int key = a[low];
  while (first <last)
  {
    while (first<last && a[last]>=key)
      last--;
    a[first] = a[last];
    while (first<last &&a[first]<= key)
      first++;
    a[last] = a[first];
  }

//////重新将key值赋给first,现在first的位置就是个分界线,他站在了自己应属的位置,不用动了

////first将数组分成两个  第一个是low  到 first-1,第二个是first+1 到high  。

///注意,此算法和上面的算法区别是本算法是用low和high保存数组的第一个和最后一个元素的下标。

///但本质是一样的。first保存了数组分割位置
  a[first] = key;

  Qsort(a,low,first-1);
  Qsort(a,first+1,high);

}

 

快速算法的两个实现方法