排序算法(快排,希尔排序)

本文详细介绍了两种排序算法——快速排序和希尔排序的基本思想及其实现过程。快速排序通过一趟排序将序列分为两部分,再递归排序;希尔排序则采用增量比较交换的方式逐步缩小增量完成排序。

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

         1. 快速排序算法

            思想:通过一趟排序将待排序记录分割成独立的两部分,其中一部分的关键字比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。代码如下:

           void QuickSort(int arr[],int len)

           {

                  QSort(arr,1,len);

           }

           void QSort(int arr[],int low,int high)

           {

                  int privot;

                  if(low<high)

                  {

                          privot=Partition(arr,low,high);

                          QSort(arr,low,privot-1);

                          QSort(arr,privot+1,high);

                  }

           }

           int Partition(int arr[],int low,int high)

           {

                    int privotkey;

                    privotkey=arr[low];

                    while(low<high)

                    {

                           while(low<high&&arr[high]>=privotkey)

                          {

                                 high--;

                          }

                          swap(arr,low,high);

                          while(low<high&&arr[low]<=privotkey)

                          {

                                  low++;

                          }

                          swap(arr,low,high);

                    }

                    return low;

           }

           快速排序算法的时间复杂度为O(n2),即二次方。

        2. 希尔排序

           思想:希尔排序的思想就在于设置了一个增量,比如增量初始化为len(假设len=10),每次为in=in/3+1,那么我们在第一次的时候的时候就用arr[1]与arr[5]作比较,如果大于,则交换,然后比较arr[2]和arr[6]的值,.........直至增量小于等于1时结束。代码如下:

          void ShellSort(int arr[],int len)

          {

                 int i,j;

                 int in=len;

                 do

                 {

                        in=in/3+1;                        //增量

                       for(i=in+1;i<len;i++)

                       {

                                if(arr[i]<arr[i-in])

                                {

                                        arr[0]=arr[i];         //暂存在arr[0]中

                                        for(j=i-in;j>0&&arr[0]<arr[j];j-=in)

                                        {

                                               arr[j+in]=arr[j];       //相隔增量的位置的记录值都需要比较一下,以找到正确的插入位置

                                        }

                                        arr[j+in]=arr[0];

                                }                            

                       }

                 }while(in>1)

          }

          希尔排序的时间复杂度为O(n(3/2)),即n的3/2次方。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值