InsertionSort是最简单的排序,算法复杂度为O(n^2)
以下是插入排序的伪代码
INSERTIONSORT(A)
for j = 2 to A.length
//insert A[j] in the unsorted area to the sorted 1 to j - 1 region
key = A[j]
i = j -1
while i > 0 and A[i] > key
A[i+1] = A[i]
i--
A[i+1] = key
在这个算法当中,整个数组被分成两部分,左边排好序的部分和右面未排序的部分,每次从右面取一个元素插入有序区。
初始化:起始有序区只有一个元素,此时有序区显然有序
保持:每一次迭代都是将无序区最左面一个元素插入到有序区之中过后有序区都会增长1个元素仍为有序
终止:循环终止时j = A.length,此时最后一轮操作是将秩为j的元素插入到1~j-1的有序区当中,因此整个数组是有序的。
下面是使用C++实现的代码及测试,如有不规范的地方,还望高人指点。
#include <iostream>
using namespace std;
void InsertionSort( int * A, int size);
void InsertionSort(int * A, int size)
{
int key = 0, i = 0;
for (int j = 1; j < size ; j ++ )
{
key = A[j]; //当前循环位置的数组元素
i = j - 1; //有序区的右界,下面的循环将key插入至有序区内
while ( i >= 0 && (A[i] > key))
{
A[i + 1] = A[i];//大于key的部分向右移动一个位置
i = i - 1;
}
A[i + 1] = key;//最后把key值放到他应当放到的位置
}
}
int ArryTest[] = { 5, 2, 4, 6, 1, 3};
int main() {
for( int i = 0; i < 6 ;i ++)
cout<<" " << ArryTest[i]<<" " ;
InsertionSort(ArryTest, sizeof(ArryTest)/sizeof(ArryTest[1]));
cout<<endl;
for( int i = 0; i < 6 ;i ++)
cout<<" " << ArryTest[i]<<" " ;
return 0;
}
PS:这是我的第一篇blogs 也许不会有人读到,但一定可以激励自己努力学好算法,把自己的兴趣坚持下去。