快速排序的理解

本文对比了两种不同的快速排序算法实现,并详细分析了各自的partition函数。一种是从前往后扫描,另一种则是从两端向中间扫描来确定枢轴的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  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(" ");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值