5种排序方法总结和代码分析

2:插入排序:

顾名思义 将数据插入到合适的位置。即从头开始判断,若是想从大到小排序 只需要每次判断该元素是否大于前面的数若是大于前面的数 则位置不变 若是小于前面的数,则以此往前查找 寻找合适的位置  并且将数据不断后移

3冒泡排序:
遍历数组 不断将最大或者最小的元素放到最后一位,从而达到排序目的 时间复杂度o(n^2)

可以进行判断从而提前结束循环减少运行时间(但是此处并未体现)

4:快速排序:

先取出一个值  将比其大的放置右侧  比其小的放置左侧,然后对其左右两侧生成的子链重复上述操作。

下面是一个演示过程

55  

47

88

154

163

Arr[0]                           arr[1]                               arr[2]                       arr[3]                arr[4]

这个时候我们把55取出  然后从最右侧开始判断 也就是163 比55大 我们继续把cnt_right(4)左移成3  这时154还比55大 继续左移 88还是比55大 继续左移 47比55小 所以把47放在我们取出的55的位置arr[0](以上为1代码所示过程) (然后进行2代码所示)

此时arr[cnt_left]<=point  cnt_left会++后和cnt_right相等,此时将取出的55放置arr[cnt_left]处

进行完后生成的数组为

47

55

88

154

163

arr[0]                                   arr[1]                              arr[2]                  arr[3]               arr[4]

此时左子链为

47

 Arr[0]

右子链为

88

154

163

     Arr[2]                                                                   arr[3]                              arr[4]

接下来会进行change(arr,left,cnt_right-1);//处理左子链

此时left>=right 所以会直接return

接下来会进行change(arr,cnt_left+1,rinht);//处理右子链

接下来就重复上述操作 把88取出 163比88大 154比88大 位置不变 生成右子链

154

163

                            Arr[3]                                                      arr[4]

然后再次进行change(arr,left,cnt_right-1);//处理左子链

Left>=right 直接return

然后再次进行  change(arr,cnt_left+1,rinht);//处理右子链

此时把154取出 163大于154位置不变cnt_right--后等于cnt_left 此时循环结束将154放置arr[3]

此时没有左子链,右子链为

163

调用change(arr,left,cnt_right-1);//处理左子链

和change(arr,cnt_left+1,rinht);//处理右子链时根据开始的if语句都会直接return 至此排序完成

5.希尔排序:

希尔排序是在插入排序的基础上进行的。插入排序的间隔为1,希尔排序是通过将其按照一定的间隔进行分组 然后对同一组中的数据进行插入排序,并不断地将间隔减小重复上述操作,从而达到排序的目的。

实例演示如下:

45

77

1

32

888

Arr[0]                               arr[1]                      arr[2]                      arr[3]                     arr[4]

第一次事 间隔为5/2=2;

所以会判断arr[0]45 和arr[2] 1  将45向后移动2个单位 使arr[2]为45 arr[0]为1

然后判断arr[1]和arr[3] 使arr[1]=32  arr[3]=77  然后判断arr[2]和arr[4] 使不改变

从而得到结果

1

32

45

77

888

       arr[0]                            arr[1]                        arr[2]             arr[3]                       arr[4]

此时temp/=2后temp=1

重复上述操作得到最后结果

1

32

45

77

888

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值