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 |