各种排序方式的使用
一、排序的简单介绍
排序算法的稳定性:稳定性是指能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。例如,a1、a2的值相等,排序前 a1在a2位置前,排序后a1还是在a2位置前,则算法稳定。
下面举例时,都按从小到大排序。
(1)直接插入排序 (Straight Insertion Sort)
时间复杂度 O(n^2) 空间复杂度 O(1) 稳定
将要排序的元素放入结构体数组tmp[0...n-1]中,排序过程中,数组被分为子区间tmp[0...i-1]和tmp[i...n-1],其中前一个子区间是有序区;后一个子区间是无序区,i每加1时,要求tmp[i]插入到tmp[0...i-1]中适当的位置上,tmp[0...i]变为有序区。
原始序列 4 7 3 9 6
第一步(4) (7 3 9 6)//第一个括号中序列为有序,第二个括号中无序
第二步(4 7) (3 9 6)//取无序区中第一个元素7,for循环有序区,查找合适的位置插入(此处可用二分查找优化)
第三步(3 4 7)(9 6)//取无序区中第一个元素3,for循环有序区,查找合适的位置插入
第四步(3 4 7 9)(6)//取无序区中第一个元素9,同上
第五步(3 4 6 7 9)排序完成
(2)希尔排序(Shell's Sort)
时间复杂度 O(nlog_{2}) 空间复杂度 O(1) 不稳定
先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序(一般d2=d1/2),直至所取的增量 =1( < …<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
下列图片中:
(3)冒泡排序
时间复杂度 O(n^2) 空间复杂度 O(1) 稳定
在tmp[0...n]中,通过无序区相邻元素间的交换,使得无序区的最大元素下沉至有序区。第一次排序中无序区的最大元素到达位置tmp[n-1]的位置,下一次排序中,tmp[n-2]的位置上会填入tmp[0...n-2]中的最大元素,以此类推,知道i=n-1时程序截止。
原始序列 4 7 3 9 6
第一趟排序 4 3 7 6 9 //4比7小,故不交换位置。7比3大,则交换位置(4 3 7 9 6)。7比9小,故不交换位置。9比6大,则交换位置(4 3 7 6 9)。
第二趟排序 3 4 6 7 9 //4比3大,则交换位置(3 4 7 9 6)。4比7小,故不交换位置。7比6大,则交换位置(3 4 6 7 9)。
第三趟排序3 4 6 7 9 //3比4小,则交换位置。4比6小,则交换位置。
第四趟排序3 4 6 7 9 //3比4小,则交换位置。
第五趟排序3 4 6 7 9 //排序完成
(4)快速排序(Quick Sort)
时间复杂度 O(nlog_{2}) 空间复杂度 O(nlog_{2}) 不稳定
排序开始时,将第一个元素作为关键字,大于关键字的数字放在关键字后,小于关键字的数字放在关键字前(无序),则关键字归位,这种算法是以递归的方式写出来的。每次在排列完当前长度数组的关键字后,分别排列他的左区间和右区间,直到每个子区间内只剩一个关键字为止。
有一点需要注意
例如 6 2 7 3 8 9
第一趟排序以后是3 2 7 6 8 9 并不是 2 3 6 7 8 9,这是由算法的代码决定的。在学习时,建议看着代码自己手动模拟一遍。可以看百度百科中的排列演示
(5)直接选择排序
时间复杂度 O(n^2) 空间复杂度 O(1) 不稳定
排序开始时,有数组tmp[0...n-1],其基本思想:第一次从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次,得到一个按排序码从小到大排列的有序序列·
下标 |
0 |
1 |
2 |
3 |
4 |
原始序列 |
4 |
7 |
3 |
9 |
6 |
第一趟排序
在待排序列式(4 7 3 9 6)中最小的是3,3与小标为0的元素交换,待排序列式(4 7 9 6)
下标 |
0 |
1 |
2 |
3 |
4 |
原始序列 |
3 |
7 |
4 |
9 |
6 |
第二趟排序
在待排序列式(4 7 9 6)中最小的是4,4与小标为1的元素交换,待排序列式(7 9 6)
下标 |
0 |
1 |
2 |
3 |
4 |
原始序列 |
3 |
4 |
7 |
9 |
6 |
第三趟排序
在待排序列式(7 9 6)中最小的是6,6与小标为2的元素交换,待排序列式(9 7)
下标 |
0 |
1 |
2 |
3 |
4 |
原始序列 |
3 |
4 |
6 |
9 |
7 |
第四趟排序
在待排序列式(9 7)中最小的是7,7与小标为3的元素交换,待排序列式(9)
下标 |
0 |
1 |
2 |
3 |
4 |
原始序列 |
3 |
4 |
6 |
7 |
9 |
第五趟排序
排序完成
下标 |
0 |
1 |
2 |
3 |
4 |
原始序列 < |