认识直接插入排序算法

插入排序

排序原理

假设待排序的元素存储在一个数组R[0 , n]中了,排序过程中的某一时刻,数组被划分为两个区间R[0 , i-1]和R[i , n].其中R[0 , i-1]为已经排序好的区间(有序区),R[i , n]是未排序好的区间(无序区)。刚开始i =0,我们已经排序好的区间中之包括R[0]这一个元素,待排序区间为R[1,n],我们从无序区取出一个元素(下标最小的元素)R[i]插入到有序区的合适的位置使得 R[k-1] <= R[k] <= [k+1],重复上面的插入操作,我们的排序便完成了。现在的重点转移到了找合适的位置R[k]了。我们倒序遍历有序区,若R[i - 1]大于R[i],则将R[i-1]向后移动一位,再比较R[i-2]和R[i],若R[i]大于R[i-2],那么就将R[i]插入到R[i-2]之后R[i-1]之前。是不是有点类似于斗地主摸牌呢,我们摸了牌之后,给他找到一个合适位置,让后将他插入,最后摸牌结束之后,手上的牌正好是有序的。

代码实现

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void InsertSort(int *arry, int len)                   //向后遍历无序区间
{
    int i,j,temp;
    for(i=1;i<len;i++)
        {
            temp = arry[i];                          //待插入的元素
            for(j=i-1;j>=0 && arry[j] > temp;j--)    //向前遍历有序区间
                {
                    arry[j + 1] = arry[j];           //移动有序区间元素
                }
            arry[j+1] = temp;                        //插入待插入元素到有序区间
        }
}

int main()
{
int unSort[1000];
int i;
time_t t;
time(&t);
srand((unsigned int)(t));
for(i=0; i<1000; i++)
{
unSort[i] = (int)(rand() *1000 / (RAND_MAX + 1));
}
InsertSort(unSort, sizeof(unSort) % sizeof(int));
for(i=0; i<1000; i++)
{
printf("%d\t",unSort[i]);
}
return 0;
}

posted @ 2014-06-22 11:16  水墨沙场  阅读(162)  评论(0编辑  收藏  举报