认识直接插入排序算法
排序原理
假设待排序的元素存储在一个数组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;
}