文档介绍:概述
插入排序
快速排序
选择排序
基数排序
各种内排方法比较
第十章内部排序
1
概 述
排序:将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。
数据表(datalist): 它是待排序数据对象的有限集合。
主关键字(key): 数据对象有多个属性域, 即多个数据成员组成, 其中有一个属性域可用来区分对象, 作为排序依据,称为关键字。也称为排序码。
2
排序方法的稳定性: 如果在对象序列中有两 个对象r[i]和r[j], 它们的排序码 k[i] == k[j] , 且在排序之前, 对象r[i]排在r[j]前面。如果在排序之后, 对象r[i]仍在对象r[j]的前面, 则称这个排序方法是稳定的, 否则称这个排序方法是不稳定的。
内排序与外排序: 内排序是指在排序期间数据对象全部存放在内存的排序;外排序是指在排序期间全部对象个数太多,不能同时存放在内存,必须根据排序过程的要求,不断在内、外存之间移动的排序。
3
排序的时间开销: 排序的时间开销是衡量算法好坏的最重要的标志。排序的时间开销可用算法执行中的数据比较次数与数据移动次数来衡量。
4
内排序分类
依不同原则
插入排序、交换排序、选择排序、归并排序和计数排序等。
依所须工作量
简单排序---时间复杂度o(n2)
先进排序方法---时间复杂度o(n logn)
基数排序---时间复杂度o()
5
插入排序 (Insert Sorting)
基本思想 当插入第i (i 1) 个对象时, 前面的V[0], V[1], …, V[i-1]已经排好序。这时, 用V[i]的排序码与V[i-1], V[i-2], …的排序码顺序进行比较, 找到插入位置即将V[i]插入, 原来位置上的对象向后顺移。
基本思想 每步将一个待排序的对象, 按其排序码大小, 插入到前面已经排好序的一组对象的适当位置上, 直到对象全部插入为止。
直接插入排序 (Insert Sort)
6
直接插入排序过程
0 1 2 3 4 5 temp
i = 1
i = 2
0 1 2 3 4 5 temp
21
08
25
49
25*
16
21
25
08
49
25*
16
25
21
25
08
49
25*
16
21
25
08
49
25*
16
49
21
25
08
49
25*
16
i = 3
21
25
08
49
25*
16
25*
21
25
08
49
25*
16
7
i = 4
i = 5
21
25
08
49
25*
16
16
16
21
25
08
49
25*
16
21
25
08
49
25*
16
21
25
08
49
25*
16
08
8
直接插入排序的算法
typedef int SortData;
void InsertSort ( SortData V[ ], int n ) {
//按非递减顺序对表进行排序
SortData temp; int i, j;
for ( i = 1; i < n; i++ ) {
temp = V[i];
for ( j = i; j > 0; j-- ) //从后向前顺序比较
if ( temp < V[j-1] ) V[j] = V[j-1];
else break;
V[j] = temp;
}
}
9
算法分析
设待排序对象个数为 n, 则该算法的主程序执行n-1趟。
排序码比较次数和对象移动次数与对象排序码的初始排列有关。
最好情况下, 排序前对象已按排序码从小到大有序, 每趟只需与前面有序对象序列的最后一个对象比较1次, 移动2次对象, 总的排序 码比较次数为 n-1, 对象移动次数为 2(n-1)。
10