数据结构--插入排序
数据结构--插入排序
什么是排序?
排序:将无序序列排成一个有序序列的运算.

排序的应用非常广泛.

排序方法的分类

按照储存介质分类.
内部排序:数据量不大,数据在内存,无序内外存交换数据.
外部排序:数据量较大,数据在外存(文件排序).

按比较器个数分类
- 串行排序:单处理机(同一时刻比较一对元素)
- 并行排序:多处理机(同一时刻比较多对元素)

按主要操作分为
比较排序:使用比较的方法排序
基数排序:不比较元素的大小,仅仅根据元素本身的取值确定其有序位置.

按辅助空间可分为
原地排序:辅助空间用量为O(1)的排序方法。
(所占的辅助存储空间与参排序的数据量大小无关)
非原地排序:捕助空间用量超过可的排序方法。

按稳定性按分为:
稳定排序:能够使任何数值柚等的元素,排序以后相对次序不变。
非稳定性排序:不是稳定排序的方法。

稳定排序:相对位置不发生改变
不稳定排序:相对位置发生改变

排序的稳定性只对结构类型数据排序有意义。

·按自然性可分为:
·自然排序:输入数据越有序,排序的速度越快的排序方法。
·非自然排序:不是自然排序的方法。

重点学习
内部排序
串行排序
比较排序
基数排序

存储结构--记录序列以顺序表存储

插入排序
基本思想:
每步将一待排序的对象,按其关
键码大小,插入到前面己经排好序的一
组对象的适当位置上,直到对象全部插
入为止。
基本操作:有序插入.


插入元素在那里?

插入排序的种类

直接插入排序

使用哨兵进行插入排序

直接插入排序的算法实现

直接插入排序的--性能分析
最好的情况

最坏的情况

平均情况

直接插入排序的时间复杂度.


代码实现
#include <bits/stdc++.h>
using namespace std;
/*
排序下标从1到n的元素
*/
void insertsort(int a[], int n) {
int i, j;
for ( i = 2; i <= n; i++) { //从第二个位置开始插入排序
if (a[i] < a[i - 1]) { //如果当前的位置小于前面的位置
a[0] = a[i]; //复制a[i]到哨兵位置
//从i-1位置开始寻找,直到a[0]<a[j]
for ( j = i - 1; a[0] < a[j]; j--) {
a[j + 1] = a[j];//每次将不符合的元素向后移动
}
a[j + 1] = a[0];//最后将相应的元素放入合适的位置
}
}
}
int main () {
int a[] = {0, 8, 5, 4, 3, 2, 5, 2, 5};
insertsort(a, 8);
for (int i = 1; i <= 8; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
折半插入排序
查找插入位置时采用折半查找法

算法描述

折半查找比顺序查找快,所以折半插入排序就性能来说比直接插入排序要快

直接插入排序和折半插入排序的元素移动次数相同

希尔排序
可以增大移动的步幅吗?
希尔排序:比较一次,移动一大步.

希尔排序算法:
-
缩小增量
-
多遍插入排序

算法描述

排序思路

希尔排序特点

希尔算法实现

其中某一趟的排序操作

希尔排序算法分析
采用不同的增量序列的算法效率.

希排序是一种不稳定的排序算法.


排序方法的比较


浙公网安备 33010602011771号