基本思想:每一步将一个待排序的元素,按其排序码的大小,插入到前面已经排好序的,元素直到插入全部完为止。
【直接插入排序】
当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经
排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序
进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移序后移
直接插入排序:
元素集合越接近有序,直接插入排序算法的时间效率越高
最优情况下:时间效率为O(n)
最差情况下:时间复杂度为O(n^2)
空间复杂度:O(1),它是一稳定的排序算法
直接插入排序
void InsertSort(int* array,int size)
{
int i = 0;
for (i = 1; i < size; ++i)
{
int key = array[i];
int end = i - 1;
while (end >= 0 && key < array[end])
{
array[end + 1] = array[end];
--end;
}
array[end+1] = key;
利用二分查找思想找待插入元素的位置要比直接插入排序效率高一些,特别是元素有序时
//利用二分查找思想找待插入元素的位置
void BinarySearchSort(int* array, int size)
{
int i = 0;
for (i = 1; i < size; ++i)
{
int key = array[i];
int end = i - 1;
int left = 0;
int right = end;
while (left <= right)
{
int mid = left + (right - left)/2;
if (key < array[mid])
right = mid - 1;
else
left = mid + 1;
}
//搬移元素,将left及其后面元素都朝后搬移一个元素
while (end >= left)
{
array[end + 1] = array[end];
--end;
}
array[left] = key;
}
}
【希尔排序 】
又称缩小增量排序,是对直接插入排序的优化
时间复杂度为(gap是第三种取法):O(N^1.25~1.6N^1.25)
时间复杂度与gap有关
gap的取值:(1)取素数;(2)gap=gap / 2; (3)gap = gap / 3 + 1;
空间复杂度为:O(1)
希尔算法不稳定,适用于数据量大的排序
//希尔排序
void shellSort(int* array, int size)
{
int i = 1;
int gap = size;
while (gap > 1)
{
gap = gap / 3 + 1;
for (i = gap; i < size; i++)
{
int key = array[i];
int end = i - gap;
while (end >= 0 && key < array[end])
{
array[end + gap] = array[end];
end -= gap;
}
array[end + gap] = key;
}
}
}
打印函数
void print(int* array, int size)
{
int i = 0;
for (i = 0; i < size; i++)
printf("%d ", array[i]);
printf("\n");
}
测试函数
#include "Sort.h"
int main()
{
int array[] = { 2, 5, 4, 9, 3, 6, 8, 7, 1, 0 };
int size = sizeof(array) / sizeof(array[0]);
//InsertSort(array, size);
//BinarySearchSort(array, size);
shellSort(array,size);
print(array, size);
system("pause");
return 0;
}