赞
踩
1、算法思想:直接插入排序是指,将一个新记录插入到已经排序好的有序表当中,然后得到一个新的有序表。
即:先将有序表序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。
2、算法要点:要注意设立哨兵,让哨兵充当临时存储和判断数组边界的使者。
3、算法稳定性:直接插入算法是稳定的。
4、算法top:如果执行一个和插入元素相等的数据进行插入排序,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序。
5、直接插入算法的时间复杂度:
6、算法演示:
- void print(int a[], int n ,int i){
- cout<<i <<":";
- for(int j= 0; j<8; j++){
- cout<<a[j] <<" ";
- }
- cout<<endl;
- }
-
-
- void InsertSort(int a[], int n)
- {
- for(int i= 1; i<n; i++){
- if(a[i] < a[i-1]){ //若第i个元素大于i-1元素,直接插入。小于的话,移动有序表后插入
- int j= i-1;
- int x = a[i]; //复制为哨兵,即存储待排序元素
- a[i] = a[i-1]; //先后移一个元素
- while(x < a[j]){ //查找在有序表的插入位置
- a[j+1] = a[j];
- j--; //元素后移
- }
- a[j+1] = x; //插入到正确位置
- }
- print(a,n,i); //打印每趟排序的结果
- }
-
- }
-
- int main(){
- int a[8] = {3,1,5,7,2,4,9,6};
- InsertSort(a,8);
- print(a,8,8);
- }
7、实例演示:
以一组数据{12,15,9,20,6,31,24} 为例,进行直接插入排序的算法演示:
8、总结:
时间复杂度:
(1)顺序排列时,只需比较(n-1)次,插入排序时间复杂度为O(n);
(2)逆序排序时,需比较n(n-1)/2次,插入排序时间复杂度为
(3)当原始序列杂乱无序时,平均时间复杂度为。
空间复杂度:
插入排序过程中,需要一个临时变量temp存储待排序元素,因此空间复杂度为O(1)。
算法稳定性:
直接插入排序是一种稳定的排序算法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。