排序算法之快速排序

【C/C++】 专栏收录该内容
53 篇文章 6 订阅

快速排序

思想:快速排序的思想更为深刻,随意选取一个数(一般选择a[0])作为基准值,然后在数组的左右两边设置两个哨兵,先让右边的哨兵进行巡逻,找到比基准值小的数;再让左边的哨兵进行巡逻,找到比基准值大的数,将两者交换。这里注意要先让右边的哨兵先出动。左右哨兵都找到后将找到的数据调换,就这样左右两个哨兵一直寻找一直调换,最后左右哨兵会相遇。由于总是右边的哨兵先寻找,所以最后找到的数字一定是比起始值小的数,这样就可以和起始的a[0]调换,这也就解释了为什么一定要右边的哨兵先移动。如果让左边的哨兵先移动,就会找到比起始值大的数,此时就不容易调换了。将起始值与相遇值调换之后,左右两侧再采用故技重施即可!

//给定数组快速排序,从小到大排列。

 

#include <stdio.h>

 

int a[10]={1,23,41,31,45,767,48,90,6,88};

 

void quicksort(int left,int right)

{

         inti,j,temp,t;

         if(left>right)

                   return;

 

         i=left;

         j=right;

         temp=a[left];

         while(i!=j)

         {

                   while(a[j]>=temp&&j>i)

                            j--;

                   while(a[i]<=temp&&j>i)

                            i++;

                   if(j>i)

                   {

                            t=a[i];

                            a[i]=a[j];

                            a[j]=t;

                   }

         }

         a[left]=a[i];

         a[i]=temp;

         quicksort(left,i-1);

         quicksort(i+1,right);

}

 

int main()

{

        

         intk;

 

         printf("\nThesorted numbers are:\n");

         quicksort(0,9);

         for(k=0;k<10;k++)

         {       

                   printf("%5d",a[k]);

         }

         printf("\n\nend\n");

}

 

 

 

 

//给定数组快速排序,从小到大排列。

 

#include <stdio.h>

 

int p;

         intk;

 

int a[1000];

 

void quicksort(int left,int right)

{

         inti,j,temp,t;

         if(left>right)

                   return;

 

         i=left;

         j=right;

         temp=a[left];

         while(i!=j)

         {

                   while(a[j]>=temp&&j>i)

                            j--;

                   while(a[i]<=temp&&j>i)

                            i++;

                   if(j>i)

                   {

                            t=a[i];

                            a[i]=a[j];

                            a[j]=t;

                   }

         }

         a[left]=a[i];

         a[i]=temp;

         quicksort(left,i-1);

         quicksort(i+1,right);

}

 

int main()

{

         for(p=0;p<1000;p++)

         {        a[p]=1000-p;

         }

         printf("\nThe  numbers are:\n");

         for(k=0;k<1000;k++)

         {       

                   printf("%5d",a[k]);

         }

         printf("\n\nThesorted numbers are:\n");

         quicksort(0,999);

         for(k=0;k<1000;k++)

         {       

                   printf("%5d",a[k]);

         }

         printf("\n\nend\n");

}

  • 1
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值