DS中的快速排序,现有两种代码实现,现两种代码调试都正常,但第一种我个人理解有问题还是贴出来与大家共享
第一种:
//快速排序算法
#include <stdio.h>
#include <stdlib.h>
#define N 16
int a[N]={14,10,11,5,6,15,0,8,7,13,12,2,1,3,9,4};
void swap(int i ,int j) //swap函数:交换a[i]与a[j]的值
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
int partition(int l,int r) //返回枢轴所在位置
{
int i,j;
for (i=l+1,j=l;i <=r;i++)
{
if (a[i] <a[l]) swap(i,++j);
//if (a[i] <a[l]) swap(i,j); //如果用这句实现的话也正常
}
swap(j,l);
return j; //返回枢轴所在位置
}
void quick_sort(int l,int r)
{
if (l>=r)//若数组包含的元素个数少于两个则不执行任何操作
{
return;
}
else
{
int k = partition(l,r); //将数组a[low..high]一分为二
quick_sort(l,k-1); //对低子表递归排序
quick_sort(k+1,r); //对高子表递归排序
}
}
int main()
{
int i;
//srand(time(NULL));
//for (i=0; i <N; i++) a[i] = rand() %100;
printf("待排序的数据:/n");
for (i=0; i <N; i++) {printf("%3d",a[i]);} puts(" ");
quick_sort(0,N-1);
printf("快速排序后的数据:/n");
for (i=0; i <N; i++) {printf("%3d",a[i]);} puts(" ");
return 0;
}
问题:现在小弟不能理解的就是partition()函数,第一次执行是:
partition(0,15)
{
int i,j;
for (i=0,j=1;i <=15;i++)
{
if (a[i] <a[l]) swap(i,++j);
//当a[0] <a[1] 交换 swap(1,1) 这是不是有错吧?书上是先从后向前找第一个关键字小于pivotkey的记录和枢轴记录互相交换,可上面怎么好像是从前开始??
//if (a[i] <a[l]) swap(i,++j); //如果用这句实现的话也正常
}
swap(j,l);
return j; //返回枢轴所在位置
}
总是感觉上面的程序实现与书本上写的方式不一样,就找到一个与书本上方式一样的代码,很容易理解(转载)
#include <stdio.h>
#define N 16
int data[N] = {14,10,11,5,6,15,0,8,7,13,12,2,1,3,9,4};
void quick_sort(int data[], int low, int high)
{
int i, j, pivot;
if (low < high)
{
pivot=data[low];
i=low;
j=high;
while(i<j)
{
while (i<j && data[j]>=pivot)
j--;
if(i<j)
data[i++]=data[j]; //将比枢轴记录小的记录移到低端
while (i<j && data[i]<=pivot)
i++;
if(i<j)
data[j--]=data[i]; //将比枢轴记录大的记录移到高端
}
data[i]=pivot; //枢轴记录移到最终位置
quick_sort(data,low,i-1);
quick_sort(data,i+1,high);
}
}
void main()
{
int i;
printf("待排序的数据:/n");
for (i=0; i<N; i++) {printf("%3d",data[i]);} puts(" ");
quick_sort(data,0,N-1);
printf("快速排序后的数据:/n");
for (i=0; i<N; i++) {printf("%3d",data[i]);} puts(" ");
}
快速排序的理解
最新推荐文章于 2022-04-22 17:02:08 发布