七大排序之插入排序

Posted jibisheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了七大排序之插入排序相关的知识,希望对你有一定的参考价值。

做法;将无序序列插入到有序序列中;

 

结论:插入排序在什么情况下效率高: 【1】如果序列基本有序的情况下【2】插入排序时候数据序列比较少。

 

 

例子: 3 1 4 2 5 共五个数字. length=5;

【1】第一步先将序列分为有序序列和无序序列

有序:3

无序:1 4 2 5

【2】将无序序列插入到有序序列中,所以外层循环变量i应该从下标为1的1开始到下标为4的值为5结束;

for (int i = 1; i < length; i++) 

【3】将arr[i]与arr[i-1]比较,如果arr[i]<arr[i-1],将arr[i]保存至临时变量temp中,此时进入内层循环;

if (arr[i - 1] > arr[i]) {
            int temp = arr[i];

【4】定义内层循环k,k初始化为i的前一个值即:k=i-1,(k>=0),将保存下来的temp值与arr[k]比较,若temp值小,则将arr[k](即arr[i])的位置被arr[k]重写覆盖,此时k--,再比较arr[k]与temp的值,若temp小则将arr[k+1]=arr[k],依次下去,直到arr[k]<temp值,将temp值重写进arr[k+1]中。

1         if (arr[i - 1] > arr[i]) {
2             int temp = arr[i];
3             int k = i - 1;
4             for (; k >= 0 && arr[k] > temp; k--) {
5                 arr[k + 1] = arr[k];
6             }
7             arr[k + 1] = temp;
8         }        

 

 

整体实现代码:

 1 #include<iostream>
 2 #include<time.h>
 3 #include<stdlib.h>
 4 #include<sys/timeb.h>
 5 using namespace std;
 6 const int Max = 10;
 7 
 8 void swap(int& a, int& b) {
 9     int temp = a;
10     a = b;
11     b = temp;
12 }
13 
14 long getSystemTime() {
15     struct timeb tb;
16     ftime(&tb);
17     return tb.time * 1000 + tb.millitm;
18 }
19 void Print(const int* arr, int length) {
20     for (int i = 0; i < length; i++) {
21         cout << arr[i] << " ";
22     }
23 }
24 void InsertSort(int * arr,int length) {
25     for (int i = 1; i < length; i++) {        
26         if (arr[i - 1] > arr[i]) {
27             int temp = arr[i];
28             int k = i - 1;
29             for (; k >= 0 && arr[k] > temp; k--) {
30                 arr[k + 1] = arr[k];
31             }
32             arr[k + 1] = temp;
33         }        
34     }
35 }
36 int main() {
37     int arr[Max];
38     srand((unsigned)time(NULL));
39     for (int i = 0; i < Max; i++) {
40         arr[i] = rand() % Max;
41     }
42     cout << "排序前:
";
43     Print(arr, Max);
44     long pt = getSystemTime();
45     InsertSort(arr, Max);
46     long at = getSystemTime();
47     cout << "
排序后:
";
48     Print(arr, Max);
49 
50     cout << "
time of sort:" << at - pt << "ms
";
51 
52 
53     return 0;
54 }

 

以上是关于七大排序之插入排序的主要内容,如果未能解决你的问题,请参考以下文章

数据结构之七大排序算法

七大排序之插入排序

七大排序之插入排序

算法3 七大排序之:直接插入排序和希尔排序

七大排序之:冒泡排序和快速排序

数据结构图解七大排序