插入排序的基本操作:
将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加1的有序数据。
插入排序包括:
(1)直接插入排序
(2)希尔排序
关于插入排序算法的时间复杂度和稳定性请见该博文:http://blog.csdn.net/learn_sunzhuli/article/details/47068295
算法由C++实现的代码如下,已经在 vs2010上测试通过:
#include <iostream>
using namespace std;
//对a[1] ~ a[n - 1]排序
void DirectlyInsertSort(int arr[], int len)
{
for(int i = 2; i < len; i++)
{
arr[0] = arr[i];//设立监视岗
int j = i;
while(arr[j] < arr[j- 1])
{
swap(arr[j], arr[j - 1]);
j--;
}
}
}
//对arr[0] ~ arr[len - 1]排序
void ShellSort(int arr[], int len)
{
int step = len / 2;//初始步长值
int index;//元素下标值
int tempValue;//存放数组当前元素的临时值
while(step >= 1)//step = 1, 转换为直接插入排序
{
for(int i = step; i < len; i++)//后面的元素与前面相差步长的元素相比较
{
index = i - step;//相差步长的前一个元素
tempValue = arr[i];//腾出一个空位
while(index >= 0 && tempValue < arr[index])
{
//arr[i] = arr[index];//错误,i 在该循环中为一个固定值
arr[index + step] = arr[index];//腾出一个空位
index = index - step;//再往前找相差步长的元素
}
arr[index + step] = tempValue;//将当前值放到合适的空位
}
step = step / 2;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int arr[] = {1, 3, 5, 6, 9, 8, 7, 2, 4, 0};
int len = sizeof(arr) / sizeof(arr[0]);
DirectlyInsertSort(arr, len);
//ShellSort(arr, len);
//输出排序后结果
for(int i = 0; i < len; i++)
cout<<arr[i]<<" ";
cout<<endl;
return 0;
}
排序后,数组元素按照从小到大顺序依次输出,由于数组元素已经明确给出,则不再给出排序结果截图。