排序之插入排序

 1 //排序算法
 2 //插入排序
 3 /*算法描述:
 4 1、假定第一个数是有序区,后面的数都是无序区
 5 2、将无序区的元素依次与有序区的元素比较
 6 3、从有序区中找到第一个比用于比较的无序区中的元素大的元素,同时记下该无序区的数据
 7 4、从找到的第一个比无序区中的数据大的元素起,直到有序区末尾,依次后移一个位置(逆序移动,否则产生覆盖)
 8 5、将所记下的无序区的用于比较的元素填入第一个比该元素大的有序区元素的位置(此时该元素已后移一位)
 9 ******************
10 //无序区的元素依次与有序区比较
11 //对于无序区中的当前值(i),找到第一个比它大的有序区中的数(j)
12 //若找到,则用变量记下此时用于比较的无序区的数据(i)(有序区的数据后移一位会覆盖)
13 //将有序区中当前用于比较的数(j)直到有序区末尾(i-1)的数依次后移一位(逆序移动k--,否则覆盖)
14 //此时当前用于比较的数的位置j空出来了,将无序区用于比较的数填入该位置j
15 ******************
16 
17 每循环一次有序区扩大一位,同时无序区减少一位;
18 有序区已排好序,从0开始循环,遇到的比无序区数据大的数肯定是第一个
19   
20 */
21 void sortByInsert(int array[],int length)
22 {
23     int iTemp;
24     //将无序区的元素依次与有序区的元素比较
25     for(int i=1;i<length;i++)//无序区,从下标为1的元素开始(假定下标为0的元素是有序区)
26     {
27         for(int j=0;j<i;j++)//有序区,从第一个元素开始(下标为0),有序区的最大下标为i-1
28         {
29             if(array[i]<array[j])//从有序区中找到第一个比用于比较的无序区中的元素大的元素
30             {
31                 iTemp = array[i];//同时记下该无序区的数据
32                 //从找到的第一个比无序区中的数据大的元素起,直到有序区末尾,依次后移一个位置(逆序移动,否则产生覆盖)
33                 for(int k=i-1;k>=j;k--)
34                 {
35                     array[k+1] = array[k];
36                 }
37                 //将所记下的无序区的用于比较的元素填入第一个比该元素大的有序区元素的位置(此时该元素已后移一位)
38                 array[j] = iTemp;
39             }
40         }
41     }
42}
1 int main()
2 {
3     int a[10] = {7,2,8,3,9,10,15,11,20,17};
4     printf("插入排序:\n");
5     sortByInsert(a,sizeof(a)/sizeof(int));
6     print(a,sizeof(a)/sizeof(int));
7     return 0;
8 }
原文地址:https://www.cnblogs.com/jiese/p/2564368.html