七大排序之插入排序
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 }
以上是关于七大排序之插入排序的主要内容,如果未能解决你的问题,请参考以下文章