今天调试了快速算法的代码,当然网上这样的代码一大堆,只是这个是自己一点点写的,中间易错点都出现并调试出来。留着以后自己复习用了。
交换代码:
void sw(int *a,int *b)//交换数据
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
实现方法1:
////由大到小排序
void sort(int a[],int low,int high)
{
int key=a[low];
int first=low;
int last=high;
if (first >last)
{
return;
}
while(first<=last)
{
while(a[first]>key/*&&first<last*/)
first++;
while(a[last]<key/*&&first<last*/)
last--;
if (first <=last)
{
if (first != last)
sw(&a[first],&a[last]);
first++;
last--;
}
}
//first and last 都是变化了的。实际上我们应该使用传入数组的第一个和最后一个作为递归的变量
if (last>1)
sort(a,low,last);
if(first<high)
sort(a,first,high);
}
第二种方法:
//此算法不是很好理解,特别是它的交换操作.
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);
}