有下列一组关键字序列,分别用冒泡排序,希尔排序,直接选择排序,直接插入排序,快速排序,基数排序,归并排序对此序列进行排序。
关键字序列{757,268,304,527,835,942,394,581,373,871}
1、冒泡排序(【】内表示无序区)
初始态:【757 268 304 527 835 942 394 581 373 871】
第一趟:268 304 527 757 835 394 581 373 871 942
第二趟:268 304 527 757 394 581 373 835 871 942
第三趟:268 304 527 394 581 373 757 835 871 942
第四趟:268 304 394 527 373 581 757 835 871 942
第五趟:268 304 394 373 527 581 757 835 871 942
第六趟:268 304 373 394 527 581 757 835 871 942
冒泡排序: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
2、希尔排序(增量为5,3,1)
初始态:757 268 304 527 835 942 394 581 373 871
第一趟:757 268 304 373 835 942 394 581 527 871
第二趟:373 268 304 394 581 527 757 835 942 871
第三趟:268 304 373 394 527 581 757 835 871 942
希尔排序:把记录按下标的一定增量分组,对每组使用直接插入排序算法排序,随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。
3、直接选择排序(【】内表示无序区)
初始态:【757 268 304 527 835 942 394 581 373 871】
第一趟:268【757 304 527 835 942 394 581 373 871】
第二趟:268 304【757 527 835 942 394 581 373 871】
第三趟:268 304 373【527 835 942 394 581 757 871】
第四趟:268 304 373 394【835 942 527 581 757 871】
第五趟:268 304 373 394 527【942 835 581 757 871】
第六趟:268 304 373 394 527 581【835 942 757 871】
第七趟:268 304 373 394 527 581 757【942 835 871】
第八趟:268 304 373 394 527 581 757 835【942 871】
第九趟:268 304 373 394 527 581 757 835 871 942
直接选择排序:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,....,第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,.....,第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。
4、直接插入排序(【】内表示无序区)
初始态:【757 268 304 527 835 942 394 581 373 871】
第一趟:268 757【304 527 835 942 394 581 373 871】
第二趟:268 304 757【527 835 942 394 581 373 871】
第三趟:268 304 527 757【835 942 394 581 373 871】
第四趟:268 304 527 757 835【942 394 581 373 871】
第五趟:268 304 527 757 835 942【394 581 373 871】
第六趟:268 304 394 527 757 835 942【581 373 871】
第七趟:268 304 394 527 757 835 942 581【373 871】
第八趟:268 304 373 394 527 757 835 942 581【871】
第九趟:268 304 373 394 527 581 757 835 871 942
直接插入排序:在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。依此法对所有元素进行插入,直到整个序列排为有序。
5、快速排序(【】内表示无序区,层表示对应的递归树的层数)
初始态:【757 268 304 527 835 942 394 581 373 871】
第一层:【 268 304 】373【757 527 835 942 394 581 871】
第二层:268【 304 】373【527 394】581【757 835 942 871】
第三层:268 304 373 394【527】581【757 835 942 871】
第四层:268 304 373 394 527 581【757 835】871【942】
第五层:268 304 373 394 527 581 757【 835】871 942
第六层:268 304 373 394 527 581 757 835 871 942
快速排序:
(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。
(3)对左边和右边的数据独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。
6、基数排序(【】表示队列,队列号从0到9)
初始态:757 268 304 527 835 942 394 581 373 871
第一趟:【】【581 871】【942】【373】【304 394】【835】【】【527 757】【268】【】
第二趟:【304】【】【527】【835】【942】【757】【268】【373 871】【581】【394】
第三趟:【】【】【268】【304 373 394】【】【527 581】【】【757】【835 871】【942】
基数排序:准备10个数组(0~9对应位数的0~9)
(1)按照个位数进行排序,放入数组。
(2)按照十位数进行排序,放入数组。
(3)按照百位数进行排序,放入数组。
排序后,数列就变成了一个有序序列。
7、归并排序(此处采用自底向上的归并,【】表示有序区)
初始态:【757】【268】【304】【527】【835】【942】【394】【581】【373】【871】
第一趟:【268 757】【304 527】【835 942】【394 581】【373 871】
第二趟:【268 304 527 757】【394 581 835 942】【373 871】
第三趟:【268 304 394 527 581 757 835 942】【373 871】
第四趟:【268 304 373 394 527 581 757 835 871 942】
归并排序:将已有序的子序列合并,得到完全有序的序列。即先使每个子序列有序,再使子序列段间有序,将多个有序表合并成一个有序表。