数据结构-排序算法

本文详细介绍了四种常见的排序算法:选择排序、冒泡排序、插入排序及希尔排序的基本思想、操作步骤及伪代码实现。

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

1.选择排序

基本思想:1)从待排序列中选出最小的,然后将选出元素和序列中的第一个元素互换位置(当前默认为升序排列);2)从待排序列中选出最小的,将选出元素与该子序列第一个元素(即整个序列的第二个元素)互换位置;3)直到待排序列中只剩下一个元素,停止排序过程。最后得到的是一个有序的序列。每一趟可以选出待排序列中的一个最小值。

例:待排序列(5,2,8,4,1,3)

第一趟:选出待排序列中最小的“1”(第5个位置),与第一个元素交换,得到第一趟排好的序列(1,2,8,4,5,3)。

第二趟:选出待排序列(2,8,4,5,3)中最小元素“2”(第一个元素),最小元素已经在第一个位置上,所以不交换,得到第二趟拍好的序列为(1,2,8,4,5,3)。

第三趟:选出待排序列(8,4,5,3)中的最小元素“3”(第4个位置),与第一个元素交换位置,得到第三趟排好序的序列(1,2,3,4,5,8)。

.......

依次排序,最后可以得到一个有序的序列(升序)。

2.冒泡排序

像气泡一样,轻的往上浮,重的往下沉。通过对待排序列每相邻元素比较,每一趟都可以将待排序列中的最大值放到相应的位置上。

例:待排序列a=(5,2,8,4,1,3)

第一趟:第一步得到(25,8,4,1,3)

             第二步得到(2,5,8,4,1,3)

             第三步得到(2,5,4,8,1,3)

             第四步得到(2,5,4,1,8,3)

             第五步得到(2,5,4,1,3,8

第二趟:第一步得到(2,5,4,1,3,8)

             第二步得到(2,4,5,1,3,8)

             第三步得到(2,4,1,5,3,8)

             第四步得到(2,4,1,3,5,8)

........

按着此步骤,最后可以得到一个有序的序列(升序)。

//为了便于理解,下面给出了冒泡排序的伪代码。

for i = 1 to len(a)-1:

    for j = 1 to len(a)-i:

        if a[j] > a[j+1]:  //相邻元素判断大小,交换位置

            temp = a[j+1]

            a[j+1] = a[j]

            a[j] = temp

       end if

   end for

end for

3.插入排序
3.1直接插入排序

将待排序列中的元素一个一个插入到一个已经有序的序列中。1)找到待插入的位置;2)待插入位置后面的元素后移;3)插入元素。

//伪代码实现如下:

for i =1 to len(a):

     temp = a[i]

     j = i -1

     while(j>0 && temp < a[j]):    //找到待插入点的位置

        { a[j+1] = a[j]

         j--

        }

        a[j+1] = temp     //插入元素

end for

3.2 折半插入

对一个有序的序列,待插入元素与有序序列的中间值进行比较;如果比中间值大,就在后半部分再采用相同方法对比;如果比中间值小,就与前半段元素至比对。

//伪代码实现如下:

for i =1 to len(a):

    temp = a[i]

    low = 0

    high = i-1

    while(low <= high){    //折半的方法,找到插入点位置

        mid = (low+high)/2

        if temp < a[mid]:

            high = mid -1

        else

            low = mid + 1

        end if

    }

    for (j = i-1 ; j >= high+1; j--){    //插入点位置后面元素逐个后移

         a[j+1] = a[j]

    }

    a[high+1] = temp    //插入元素

4.希尔排序

例:待排序列a=(5,2,8,4,1,3)

第一趟排序:1)d1=3,进行标记出对比交换的对(用红、绿、蓝三种颜色标记配对),(528413

                    2)对同一种颜色标记的元素比较、交换位置,得到(4,1,3,5,2,8)

第二趟排序:1)d2=1,进行标记出对换的对,由于d2=1,所以为相邻位置交换

                     2)得到(1,3,4,2,5,8)

.......

最后可以得到一个有序序列。其中,d[i+1]=d[i]/2.




          


















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值