插入排序, 算法复杂度为o(n^2)
博主觉得插入排序就像是我们打扑克的时候,假设手中的牌是有序的,而下面摸得排是无序的,那么 当我们拿一个牌后,假设这个牌是有序的,接着拿第二个牌,比较抽起的牌和手中有序牌,从后往前比较,当比手中有序的牌小的是时候,就找到了这个牌应该插入的位置。
下面是《数据结构与算法分析》中的描述:插入排序由N-1趟排序组成,对于P=1趟到P=N-1趟,插入排序保证从位置0到位置P上的元素为已排序状态。在第P趟,我们将位置P上的元素向左移动到它在前p+1个元素中的正确位置上去。从有序序列的最后一个元素开始查找,边查找边移动元素,而不是先找到插入位置再移动元素,这样提高了效率。
看下面这个例子:
原始数组为:a[6]=[34,8,64,51,32,21]
则插入排序每次的变化如下:
初始 | 34 | 8 | 64 | 51 | 32 | 21 | 移动位置 |
p=1 | 8 | 34 | 64 | 51 | 32 | 21 | 1 |
p=2 | 8 | 34 | 64 | 51 | 32 | 21 | 0 |
p=3 | 8 | 34 | 51 | 64 | 32 | 21 | 1 |
p=4 | 8 | 32 | 34 | 51 | 64 | 21 | 3 |
p=5 | 8 | 21 | 32 | 34 | 51 | 64 | 4 |
代码实现:
#include<stdio.h>
#include<stdib.h>
void InsertionSort(int arr[].int N)
{int p,j;
int temp;
for(p=1;p<N;p++)/*第P趟,把第P个元素后的无序元素和前P-1个有序元素作比较*/
{temp=arr[p];
for(j=p-1;j>0&&arr[j]>temp;j--)
{arr[j+1]=arr[j];
}
arr[j+1]=temp;
}
}
int main()
{
int array[] = {5, 15, 3, 20, 11};
InsertionSort(array, sizeof(array)/sizeof(int));
for(int i = 0; i < 5; ++i)
printf("%d ", array[i]);
printf("\n");
}