排序算是比较常用的算法之一,其种类也很多,各有特点,统一撸一遍再总结一下加深理解。以下排序统一按照由小到大顺序来排。
插入排序
插入排序就是从未排序数组中选择一个插入到排序数组的合适位置1.直接插入排序
void insert_sort()
{
for (int i = 1; i < len; i++)
{//第一个已经排好
int j = i;
int temp = list[i];
while (j > 0 && temp < list[j - 1])
{//寻找插入位置
list[j] = list[j - 1];
j--;
}
list[j] = temp;
}
}
直接插入排序性质:
1.对于随机排列长度为N且主键不重复的数组,平均情况插入排序需要N^2 / 4次比较以及N^2 / 4次交换;最坏情况下需要N^2 / 2次比较以及N^2 / 2次交换;最好情况下需要N - 1次比较和0次交换。时间复杂度为O(n^2)。
2.运行时间和输入有关,适用于某些类型的非随机数组。
3.对于部分有序的数组十分高效,也很适合小规模数组。
4.稳定性:稳定
2.二分插入排序
void Binary_sort()
{
for (int i = 0; i < len; i++)
{
int low = 0;
int high = i - 1;
int temp = list[i];
while (low <= high)
{//二分寻找插入位置
int middle = (low + high) / 2;
if (list[middle] < temp)
low = middle + 1;
else
high = middle - 1;
}
for (int j = i; j > low; j--)
{//移位
list[j] = list[j - 1];
}
list[j] = temp;
}
}
3.希尔排序
将数组按照间隔值划分,分别排好序后,再划分,整体将越来越有序
void shell_sort()
{
int gap = len / 2;
while (gap)
{//gap>=1
for (int i = gap;