例子: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个元素的序列)合并成一个序列)调用的算法:
    1. 设第一个序列为p,第二个序列q,p的指针为s,q的指针为t,s和t都是从1开始,直到s或者t大于序列长度是排序结束
    2. 设序列p的长度为p,序列q的长度为q,一个暂存序列b(放p和q合并后的序列)长度为p+q,
    3. 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,205,910,126,71,2(2个一组)

17,205,910,126,71,2(每组分别排序)

17,20,5,910,12,6,71,2(4个一组)

5,9,17,206,7,10,121,2(每组分别排序)

17,20,5,9,10,12,6,71,2(8个一组)

1,2,5,6,7,9,10,12,17,20(每组分别排序)

1,2,5,6,7,9,10,12,17,20(结果)

 

6.快速排序

  1. 红色为枢纽(通常选第一个),把序列分割两个子序列(左面的元素(绿色)比枢纽小,右面的元素(紫色)比枢纽大),
  2. 每次分割都要重新写一个序列看的比较清晰(先是空的,根据high和low的移动一个一个写就可以了,最后写枢纽的值),
  3. 设原序列第一个为low,最后一个为high,high递减,low递增,依次跟枢纽比较,
    1. 要求high指向的元素要比枢纽大(high的值:比枢纽大就落下在原来位置就可以了,比枢纽小就跟此时的low交换位置),
    2. 要求low指向的元素要比枢纽小(low的值:比枢纽小就落下在原来位置就可以了,比枢纽大就跟此时的high交换位置),
    3. 直到high和low指向同一数据,此时把枢纽写在中间就可以了,结束本轮划分,
  4. 重复123操作,直到最后枢纽分割的每个子序列的元素数都为1,排序结束
  5. 粗体为已经排好序的序列(每次的枢纽和分割的子序列只有一个时就是排好序的),其他为待排序

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,717,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. 创建堆
  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}

 

相关文章: