(一)直接插入排序
1、基本思想:将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。(先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。)
特点:越有序越快,就少了交换次数。
2、代码实现:
void InsertSort(int *arr, int len)//时间复杂度O(n2),有序时O(n),
{ //空间复杂度: O(1) 稳定
int i, j, tmp;
for (i = 1; i < len; ++i)
{
tmp = arr[i];
for (j = i-1; j >= 0; --j)
{
if (tmp >= arr[j])
{
break
}
else
{
arr[j + 1] = arr[j];
}
arr[j+1] = tmp;
}
}
- 希尔排序
- 基本思想:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。
- 代码实现:
void Shell(int *arr, int len, int gap) { int i, j, tmp; for (i = gap; i < len; ++i) { tmp = arr[i]; for (j = i - gap; j >= 0; j -= gap) { if (arr[j] <= tmp) break; else arr[j + gap] = arr[j]; } arr[j + gap] = tmp; } } void ShellSort(int *arr, int len) //时间复杂度 :取决于分组的好坏 O(n1.5 n1.3) {//增量序列之间的值都互素,要不然会有大量的重复数据 int b[] = { 5,3,1 }; //空间复杂度:O(1) O(1) 不稳定 for (int i = 0; i < sizeof(b) / sizeof(b[0]); ++i) { Shell(arr, len, b[i]); } }