直接插入排序

来源:互联网 发布:java时间相减 编辑:程序博客网 时间:2024/05/16 17:39

匈牙利大学Sapientia插入排序算法舞蹈:http://t.cn/hros0W


直接插入排序:

设置两个变量i和j,i初始化为数组的第二个元素,temp为i指向的值,j每次循环初始化为i的前一个元素,然后将i指向的值temp和j指向的值比较,如果大于j指向的值,j--,继续和j指向的值比较,如果小于j指向的值,将j指向的值放入j+1的位置,然后j--,继续向前比较,直到J的循环结束,然后将temp放入j+1的位置。开始i的下一轮循环。


数组:1        5        7        3        2  

下标:0        1        2        3        4

            j          i

i指向当前遍历的元素

temp为i指向的值

j每次循环初始化为i的前一个元素

(1)记录i指向的值,为temp,temp=5,和它之前的数比较,5大于1,i++,继续向后遍历

数组:1        5        7        3        2  

下标:0        1        2        3        4

                       j          i

(2)i指向7,temp为7,temp和5比较7大于5,j--,j指向1,7大于1,循环结束,i++,向后遍历

数组:1        5        7        3        2  

下标:0        1        2        3        4

                                 j          i

(3)temp为3,3和7进行比较,3小于7,让7放入j+1的位置变为1 5 7 7 2,j--指向5

     temp和5比较,3小于5,让5放入7的位置,即j的后一个位置(j+1),数组为 1 5 5 7 2,j--指向1

     temp和1比较,3大于1,j--=0循环结束

     将temp的值放入j+1的位置,j+1=1,数组为1 3 5 7 2

     i++

数组:1        3        5        7        2  

下标:0        1        2        3        4

                                           j          i

(4)i指向2,temp=2,temp和7比较,小于7,7放入j+1的位置为1 3 5 7 7,j--

      temp和5比较,小于5,5放入j+1的位置为1 3 5 5 7,j--

      temp和3比较,小于3,3放入j+1的位置为1 3 3 5 7,j--

      temp和1比较,大于1,直接j--=0,循环结束

     将temp的值放入j+1的位置为 1 2 3 5 6

排序结束


插入排序的时间复杂度:O(n^2)


#include <iostream>using namespace std;//直接插入排序void InsertSort(int * data,int length){if(data==NULL||length<=0)return;for(int i=1;i<length;i++){int temp=data[i];for(int j=i-1;j>=0&&temp<data[j];j--){data[j+1]=data[j];}data[j+1]=temp;}}int main(){int data[]={1,3,7,5,2};InsertSort(data,5);for(int i=0;i<5;i++){cout<<data[i]<<endl;}return 0;}




0 0