数据结构-排序-直接插入排序

                直接插入排序

  直接插入排序类似对扑克牌的整理,初始情况下把前面第一个看作有序序列,然后后面全是无序。

  这个排序写过很多遍,但是每次回顾都感觉到设计者精彩巧妙的安排。

#include<iostream>
#include<vector>
using namespace std;
//首先定义测试数组  这里对下标0处定义了一个哨兵, 然后从后往前遍历
//哨兵是为了从后往前遍历时候可以减少一次判断下标问题
int test[]={0,5,44,66,11,12,45,98,58,82};
//用数组初始化vector
vector<int> test_v(begin(test),end(test));

//打印数组
inline void printv(const vector<int>& v)
{
      for(auto a:v)
          cout<<a<<" ";
      cout<<endl;
}

//直接插入排序
void insert_sort(vector<int> &v)
{
    cout<<"直接插入排序"<<endl;
    for(int i=2;i<v.size();i++)
    {
          v[0]=v[i];//为哨兵赋值
          int j=0;
          //这里的J初始化在I前面一个位置
          //开始从正序最后一个与要插入的比较
          //假如要插入比当前正序[j]小则,j--然后把数据往后挪一个位置即可
          for(j=i-1;v[0]<v[j];j--)
          {
                v[j+1]=v[j];/*v[0]已经保存了v[i]内容不怕被覆盖真是巧妙的想法*/
           }
           //最后跳出循环时候,必然v[0]>v[j],我们只要v[j+1]=v[0]即可
           v[j+1]=v[0];
    }
    printv(v);//打印每次结果,便于观察
}
int main()
{
    insert_sort(test_v);
    return 0;
}

直接插入排序是一种稳定排序;

但是当数据量大的时候,效率会打打降低。

按照特性,最好情况下,每次只要比较一次,移动2次。分别是v[0]的初始化和v[j+1]=v[0];总的比较次数为2(n-1).

所以好情况下时间复杂度为0(n)

最坏情况下,每次要比较正序所有数字+v[0]的哨兵位,第一次是2然后3 4 5。。。。n。毫无疑问这是个平方阶

所以最坏情况是O(n^2);

原文地址:https://www.cnblogs.com/DJC-BLOG/p/9067293.html

时间: 2024-11-21 02:19:54

数据结构-排序-直接插入排序的相关文章

数据结构——排序——直接插入排序和折半插入排序算法

直接插入排序(Insertion Sort)的基本思想是: 每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止. 设数组为a[0…n-1]: 1. 初始时,a[0]自成1个有序区,无序区为a[1..n-1].令i=1 2. 将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间. 3. i++并重复第二步直到i==n-1.排序完成. #include<stdio.h> #include<stdbool.h> vo

数据结构排序-直接插入排序

每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序. 第一趟比较前两个数,然后把第二个数按大小插入到有序表中: 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中: 依次进行n-1趟扫描后就完成了整个排序过程 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int n; 5 6 /* 7 * 直接插入排序 8 */ 9 void InsertSort(int *array) 10 { 11

数据结构排序之插入排序

一  插入排序分析      对于这种插入排序呢,我认为这就是另一种排序的思想,逐个拿出每一个元素从该元素的前一个开始比较(从小到大),如果该元 素比它的前元素小,就将前元素的值赋值给该元素,直到不满足条件为止j>=0&&array[j]>min,当循环结束后, 执行 array[j+1]=min;就可以成功的将元素插入,其实这样做的话,数组前面就是有序的,而后面是无序,思想就是这样子了,但是对于时间的复 杂度吗?按照最坏的情况就是倒序时,你在正序排一遍,假如我5个数,5,4,

数据结构 排序(插入排序)

//排序--插入排序法 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> /* 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素, 存放在序列的起始位置,直到全部待排序的数据元素排完. 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导

数据结构排序算法插入排序Java实现

public class InsertDemo { public static void main(String args[]) { int[] sort ={4,2,1,3,6,5,9,8,10,7} ; System.out.println("haha"+sort[0]); System.out.println("排序前:"); print(sort); shellSort(sort); System.out.println("\n排序后:"

数据结构和算法-排序算法-插入排序

##################    插入排序        #################### """ 插入算法: alist = [54,26,93,17,77,31,44,55,20] 还是把序列分为两部分, 一开始就把第一个数字认为是有序的, alist = [54, 26,93,17,77,31,44,55,20] 第一轮, 把第二部分的和第一部分的最后一个做比较,如果小就交换, alist = [26,54 93,17,77,31,44,55,20]

数据结构复习之--“插入排序”-JAVA实现

菜鸟中的菜鸟一枚,面临找工作,复习下数据结构,写的插入排序算法记录一下,每天写一点,不断积累吧! import java.util.Scanner; /** * * @author DL * 数据结构复习之插入排序练习程序 * */ public class SortTest { public static void main(String [] args){ Scanner sc = new Scanner(System.in); int totalNums = sc.nextInt();//

JavaScript算法(冒泡排序、选择排序与插入排序)

冒泡排序.选择排序与插入排序复杂度都是指数级别的,放在一起说吧. 介绍一些学习这三个排序方法的比较好的资料.冒泡排序看<学习JavaScript数据结构与算法>介绍的冒泡排序,选择排序看<计算机科学概论(第三版)>里介绍的选择排序,插入排序看<计算机科学概论(第11版)>里介绍的插入排序, 通过这三份资料弄明白实现原理之后,最后看<学习JavaScript数据结构与算法>一书里的JS实现代码. 嗯,这本书里都有现成代码,就不在这儿写了,关键是弄清楚原理,然后

数据结构--排序

插入排序(上)     基本思想:每次将一个待排序的的元素,按其关键字大小插入到已经排好序的子表的适当位置,直到全部元素插完为止.直接插入排序    简写排序思路:     假设待排序的元素存放在R[0.....n-1]中,在排序过程中,将R划分为两个区间,分别为R[0.....i-1]和R[i....n-1](刚开始时i=1,有序区只有R[0]一个元素),    其中,前一个子区间即是一个已经排好序的子区间,即有序区,后一个子区间则是一个待排序的无序区.   直接插入排序的操作即是:将当前无序