您的位置:首页 > 其它

【算法】--插入排序

2015-07-28 17:23 204 查看
起篇---插入排序

简介:这个算法很简单,故此不做多述。

一、插入排序定义

顾名思义,插入排序,就是把后读取到的数字插入到已经排好序的序列中。如同现实中的扑克游戏,每次新抓一张牌,扫一眼手中排好序的牌,把这张新抓的牌插入到对应的位置。

二、插入排序示例

现在假设我们有一组数组: A[10] = {2, 1, 3, 9, 8, 6, 7, 4, 12, 10}。假设A[0],A[1]....A[9]分别对应10张写着对应数字的扑克牌,并扣至在桌子上。我们手中没牌。要求按照从小到大的顺序排列。

现在抓到第0张牌,哦,写的是2,对应在A[0]的位置。再抓第1张牌,哦,写着是1,对应在A[1]的位置。此时我们发现A[0]和A[1]大小颠倒,所以需要交换A[0],A[1]的位置。我们定义一个变量Key,令Key=A[1](就是我们刚抓的这张新牌)。这样A[1] = A[0]; A[0] = Key 我们就实现了A[0]
A[1]的对换。此时相当于我们排好了手中的牌。接下来我们再抓第2张牌,发现是3,对应在A[2]的位置,同样使用Key=A[2]再比较A[0] A[1]之后发现这张牌最大,所以我们不需要进行重排,直接放在A[2]的位置不变。依次类推,在抓到第4张牌,即A[4] = 8的时候,我们发现8 比上一张牌 9小(要谨记,手中的牌已经排好序,即手中的最后一张牌是最大的),所以我们依然通过Key = A[4] == 8实现A[3] A[4]位置调换。由于Key = 8比A[2] = 3大,所以不再进行位置调换。接着抓下一张牌.......直到结束。

这样插入排序的思路大致清晰了。下面直接上代码。(注意上文中我使用了位置调换这个词,其实代码中不需要每次移动位置都进行这个操作。因为新抓的牌已经放到Key里了,所以只需把A[i]的位置向后移动一位,覆盖掉后面的A[i+1],最后不再移动A[i]的时候再把Key放到它应该放的位置)。

#include <stdio.h>

int insertSort(int arr[], int n)
{
int key;
int i, j;
for(j = 1; j < n; j++)
{
key = arr[j];

i = j - 1;
while(i >= 0 && arr[i] > key)
{
arr[i + 1] = arr[i];
i--;
}
arr[i + 1] = key;
}

return 0;
}

int main(void)
{
int arr[] = {1, 6, 5, 3, 2, 9, 32, 12, 14, 26, 16, 17, 10, 11, 13};

printf("The origional sequence is: \n");
int n = sizeof(arr)/sizeof(arr[0]);
for(int i = 0; i < n; i++)
printf("%d ",arr[i]);
printf("\n\n After sourted, the sequence is:\n");
insertSort(arr, n);
for(i = 0; i < n; i++)
printf("%d ",arr[i]);
printf("\n");

}


输出结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: