算法思想:
要对元素个数为n(n>=1)的数组进行从小到大的顺序排序,首先可以把第一个元素arr[0]当做是一个初始有序序列,然后从这个有序序列之外的下一个元素开始,分别和其上一个元素进行比较,如果当前元素小于上一个元素,那么就将该元素插入到之前已经有序的序列合适的位置…… 如果你玩过斗地主,以上所有的理论说明你都可以忽略:
你在玩斗地主摸牌并整理的过程实际上就是一个直接插入排序。你首先摸一张牌,并把该牌作为基准,当你摸到下一张牌的时候,你会和上一张牌进行比对,如果第二张牌小于第一张牌,那么你可能会放到该牌的左边;接下来你摸第三张牌,之前手里的2张牌你已经排好序了,你会把第三张摸起来的牌首先和前面2张牌的最后一张进行比对,如果第三张牌比后面一张牌小,那么你会继续将这张牌和最前面的那张牌进行比对,如果还小,那么就放到最开始的位置,否则就插入到之前已经排好序的2张牌的中间,以此类推……
该排序算法的最好情况下的时间复杂度是O(n);平均时间复杂度O(n^2);最坏时间复杂度O(n^2); 是一个稳定的排序算法。
代码实现:
#include <iostream>
#include <stdlib.h>
using namespace std;
void insertionSort(int arr[], int len){
if (len <= 0)
return;
for (int i = 1; i < len; ++i){
//把arr[0]当做一个初始的有序序列,所以i从1开始
if (arr[i] < arr[i - 1]){
int curVal = arr[i];
int curIndex = i;
while (curIndex > 0){
if (curVal < arr[curIndex - 1]){
arr[curIndex] = arr[curIndex - 1];
}
else
break;
--curIndex;
}
arr[curIndex] = curVal;
}
}
}
int main(){
int arr[] = { 7, 4, 9, 2, 8, 6, 1, 5, 3, 0 };
int len = sizeof(arr) / sizeof(arr[0]);
insertionSort(arr, len);
for (int i = 0; i < len; ++i){
cout << arr[i] << endl;
}
system("pause");
return 0;
}