1.基本思想 假设待排序的记录存放在数组R[1..n]中。初始时,R[1]自成1个有序区,无序区为R[2..n]。从 i=2 起直至 i=n 为止,依次将R[i]插入当前的有序区R[1..i-1]中,生成含n个记录的有序区。
2.i-1趟直接插入排序 通常将一个记录R[i](i=2,3,…,n-1)插入到当前的有序区,使得插入后仍保证该区间里的记录是按关键字有序的操作称第i-1趟直接插入排序。
排序过程的某一中间时刻,R被划分成两个子区间R[1..i-1](已排好序的有序区)和R[i..n](当前未排序的部分,可称无序区)。
直接插入排序的基本操作是将当前无序区的第1个记录R[i]插人到有序区R[1..i-1]中适当的位置上,使R[1..i]变为新的有序区。因为这种方法每次使有序区增加1个记录,通常称增量法。
插入排序与打扑克时整理手上的牌非常类似。摸来的第1张牌无须整理,此后每次从桌上的牌(无序区)中摸最上面的1张并插入左手的牌(有序区)中正确的位置上。为了找到这个正确的位置,须自左向右(或自右向左)将摸来的牌与左手中已有的牌逐一比较。
3.说明 插入排序的时间复杂度是O(N^2),是原地排序,且是稳定的排序。
4.实现- void insertSort(int *pData, int num)
- {
- int i, j, key;
- for (j = 1; j < num; j++) // 循环次数
- {
- key = pData[j]; //把第j个元素插入到前j-1个有序的序列中
- i = j - 1; //循环的初始
- while (i >= 0 && pData[i] > key)
- {
- pData[i+1] = pData[i]; //从后往前遍历,若比key值大,则元素后移(为后面>的插入做准备)
- i--;
- } //找到第一个比key值小的位置
- pData[i+1] = key; //key插入到第i一个比key小的元素的位置之后
- }
- }
阅读(351) | 评论(0) | 转发(0) |