例子:17,20,5,9,10,12,6,7,1,2
升序排列
1.插入排序
粗体表示已排好序的序列,下划线表示每次插入的数据,为标识清楚用"|"为分界线
插入数据从已排好序的序列,从后向前依次跟每个元素比较,小于原元素就跟前一个再做比较,直到大于或等于原元素,插入
17,|20,5,9,10,12,6,7,1,2
17,20,|5,9,10,12,6,7,1,2
5,17,20,|9,10,12,6,7,1,2
5,9,17,20,|10,12,6,7,1,2
5,9,10,17,20,|12,6,7,1,2
5,9,10,12,17,20,|6,7,1,2
5,6,9,10,12,17,20,|7,1,2
5,6,7,9,10,12,17,20,|1,2
1,5,6,7,9,10,12,17,20,|2
1,2,5,6,7,9,10,12,17,20
2.选择排序
粗体表示已排好序的序列,下划线表示每次插入的数据,为标识清楚用"|"为分界线
每次从未排序的序列中选择最小的元素与第一个元素交换
17,20,5,9,10,12,6,7,1,2
1,|20,5,9,10,12,6,7,17,2
1,2,|5,9,10,12,6,7,17,20
1,2,5,|9,10,12,6,7,17,20
1,2,5,6,|10,12,9,7,17,20
1,2,5,6,7,|12,9,10,17,20
1,2,5,6,7,9,|12,10,17,20
1,2,5,6,7,9,10,|12,17,20
1,2,5,6,7,9,10,12,|17,20
1,2,5,6,7,9,10,12,17,|20
1,2,5,6,7,9,10,12,17,20
3.冒泡排序
粗体表示已排好序的序列,剩余为无序序列,每次找到无序序列中最小的元素,放在已排好序的序列最后,直到无序序列只剩一个元素,排序结束
17,20,5,9,10,12,6,7,1,2
1,17,20,5,9,10,12,6,7,2
1,2,17,20,5,9,10,12,6,7
1,2,5,17,20,9,10,12,6,7
1,2,5,6,17,20,9,10,12,7
1,2,5,6,7,17,20,9,10,12
1,2,5,6,7,9,17,20,10,12
1,2,5,6,7,9,10,17,20,12
1,2,5,6,7,9,10,12,17,20
1,2,5,6,7,9,10,12,17,20
1,2,5,6,7,9,10,12,17,20
4.希尔排序
按照一定增量分割序列(一般是原长度/2),每一组子序列的相对应位置放在一个序列(相同颜色),对每个新的序列进行插入排序,增量递减直到1,排序完成
17,20,5,9,10,12,6,7,1,2
17,20,5,9,10,|12,6,7,1,2(增量d=5)
12,6,5,1,2,|17,20,7,9,10(第一趟希尔排序)
12,6,5,|1,2,17,|20,7,9,|10(增量d=3)
1,2,5,|10,6,9,|12,7,17,|20(第二趟希尔排序)
1,|2,|5,|10,|6,|9,|12,|7,|17,|20(增量d=1)
1,2,5,6,7,9,10,12,17,20(结果)
5.归并排序
- n个元素,2个元素一组(一共分成n/2个序列),每组内进行排序,在此排序基础上,4个元素一组(一共分成n/4个序列),每组内进行排序,直到所有元素都在一个序列内,排序结束
- 4个及以上元素一组排序时(相当于把两个序列(如果是4个元素,此序列指之前的2个元素的序列)合并成一个序列)调用的算法:
- 设第一个序列为p,第二个序列q,p的指针为s,q的指针为t,s和t都是从1开始,直到s或者t大于序列长度是排序结束
- 设序列p的长度为p,序列q的长度为q,一个暂存序列b(放p和q合并后的序列)长度为p+q,
- s为1,t为1,两个元素相比较,小的进b,小的所在的序列指针后移,再次比较(①如果s指向的数小,它进入b,s加1,s+1指向的数与t指向的数再次比较,②如果t指向的数小时同理),直到s为p+1或t大于q+1时,本次排序结束
17,20,5,9,10,12,6,7,1,2
17,20,5,9,10,12,6,7,1,2(2个一组)
17,20,5,9,10,12,6,7,1,2(每组分别排序)
17,20,5,9,10,12,6,7,1,2(4个一组)
5,9,17,20,6,7,10,12,1,2(每组分别排序)
17,20,5,9,10,12,6,7,1,2(8个一组)
1,2,5,6,7,9,10,12,17,20(每组分别排序)
1,2,5,6,7,9,10,12,17,20(结果)
6.快速排序
- 红色为枢纽(通常选第一个),把序列分割两个子序列(左面的元素(绿色)比枢纽小,右面的元素(紫色)比枢纽大),
- 每次分割都要重新写一个序列看的比较清晰(先是空的,根据high和low的移动一个一个写就可以了,最后写枢纽的值),
- 设原序列第一个为low,最后一个为high,high递减,low递增,依次跟枢纽比较,
- 要求high指向的元素要比枢纽大(high的值:比枢纽大就落下在原来位置就可以了,比枢纽小就跟此时的low交换位置),
- 要求low指向的元素要比枢纽小(low的值:比枢纽小就落下在原来位置就可以了,比枢纽大就跟此时的high交换位置),
- 直到high和low指向同一数据,此时把枢纽写在中间就可以了,结束本轮划分,
- 重复123操作,直到最后枢纽分割的每个子序列的元素数都为1,排序结束
- 粗体为已经排好序的序列(每次的枢纽和分割的子序列只有一个时就是排好序的),其他为待排序
17,20,5,9,10,12,6,7,1,2
2,1,5,9,10,12,6,7,17,20(选17为枢纽)
1,2,5,9,10,12,6,7,17,20(选2为枢纽)
1,2,5,9,10,12,6,7,17,20(选5为枢纽)
1,2,5,7,6,9,10,12,17,20(选9为枢纽)
1,2,5,6,7,9,10,12,17,20(选7和10为枢纽)
1,2,5,6,7,9,10,12,17,20(结果)
7.堆排序
17,20,5,9,10,12,6,7,1,2
- 创建堆
- 堆排序
1.创建堆:把无序的序列转化为堆,堆:子节点的值不大于它的父节点的值
17,20,5,9,10,12,6,7,1,2
17,20,12,9,10,5,6,7,1,2
20,17,12,9,10,5,6,7,1,2
2.堆排序:把最后一个叶子结点与根节点交换,再把除去根节点的序列再次创建堆,重复操作,直到要创建堆的序列长度为1
粗体为每次需要创建堆的序列,下划线为排好序的序列,①为由粗体序列创建后的堆
20,17,12,9,10,5,6,7,1,2(①堆)
2,17,12,9,10,5,6,7,1,20(②叶子结点与根节点交换)
2,17,12,9,10,5,6,7,1,|20(③找到需要创建堆的序列)
17,10,12,9,2,5,6,7,1,|20(①)
1,10,12,9,2,5,6,7,17,|20(②)
1,10,12,9,2,5,6,7,|17,20(③)
12,10,6,9,2,5,1,7,|17,20(①)
7,10,6,9,2,5,1,12,|17,20(②)
7,10,6,9,2,5,1,|12,17,20(③)
10,9,6,7,2,5,1,|12,17,20(①)
1,9,6,7,2,5,10,|12,17,20(②)
1,9,6,7,2,5,|10,12,17,20(③)
9,7,6,1,2,5,|10,12,17,20(①)
5,7,6,1,2,9,|10,12,17,20(②)
5,7,6,1,2,|9,10,12,17,20(③)+0
7,5,6,1,2,|9,10,12,17,20(①)
2,5,6,1,7,|9,10,12,17,20(②)
2,5,6,1,|7,9,10,12,17,20(③)
6,5,2,1,|7,9,10,12,17,20(①)
1,5,2,6,|7,9,10,12,17,20(②)
1,5,2,|6,7,9,10,12,17,20(③)
5,1,2,|6,7,9,10,12,17,20(①)
2,1,5,|6,7,9,10,12,17,20(②)
2,1,|5,6,7,9,10,12,17,20(③)
1,2,5,6,7,9,10,12,17,20(结果)
本来想画图会更清晰的理解,但是没什么好的画图软件,我就手写了,将就看吧
8.基数排序
4567,2463,6523,7461,4251,3241,6492,7563(四位数做例子比较恰当,看的清晰一些)——————————序列1
- 设序列的元素都为k位,(不一定都是k位,以位数最多的为k,其他不够的补0,比如序列是12,102,45,此时k=3,序列为012,102,045就可以了),
- 从个位开始,直到k位结束(个,十,百,千,万... ...,k),每个"位"都按0-9分成10组,个位为例,只看个位,按序列顺序把元素放进去,十位排序时就只看十位,其他"位"同理,直到k位结束,
- 每个"位"排序都要按前一位排好的序列的顺序放进0-9的序列中(如下面,比如十位排序时,要根据序列个位排序后的"序列2"的基础下排序,百位要用十位的"序列3",千位要用百位的"序列4")
个位
- 0-
- 1-7461-4251-3241
- 2-6492
- 3-2463-6523-7563
- 4-
- 5-
- 6-
- 7-4567
- 8-
- 9-
排序后{7461,4251,3241,6492,2463,6523,7563,4567}—————————————————————————序列2
十位
- 0-
- 1-
- 2-6523
- 3-
- 4-3241
- 5-4251
- 6-7461-2463-7563-4567
- 7-
- 8-
- 9-6492
排序后{6523,3241,4251,7461,2463,7563,4567,6492}—————————————————————————序列3
百位
- 0-
- 1-
- 2-3241-4251
- 3-
- 4-7461-2463-6492
- 5-6523-7563-4567
- 6-
- 7-
- 8-
- 9-
排序后{3241,4251,7461,2463,6492,6523,7563,4567}—————————————————————————序列4
千位
- 0-
- 1-
- 2-2463
- 3-3241
- 4-4251-4567
- 5-
- 6-6492-6523
- 7-7461-7563
- 8-
- 9-
排序结果为{2463,3241,4251,4567,6492,6523,7461,7563}