一、直接插入排序
思想:1)把一个数组分为已排序和未排序的两个部分
2)从未排序的部分取出一个数据,把这个数据暂时存放在临时量中
3)从已排序的部分找到待排序数据的合适位置
4)直接插入该数据
注意:若是数据量非常大的数组排序,则所需移动的次数非常多,效率低下。所以,直接插入排序适用于数据量小,较为有序的数组。
稳定性:稳定
时间复杂度:O(n^2) 空间复杂度:O(1)
**代码实现**
#include<stdio.h>
#include<string.h>
#include<assert.h>
void InsertSort(int arr[],int len)
{
int i , j ,tmp;
for(i = 1;i < len; ++i)
{
tmp = arr[i];
for(j = i - 1;j >= 0 && arr[j] > tmp; --j)
{
arr[j+1] = arr[j];
}
arr[j+1] = tmp;
}
}
int main()//测试用例
{
int arr[] = {1,9,6,8,12,76,3};
int len = sizeof(arr)/sizeof(arr[0]);
InsertSort(arr, len);
for(int i = 0;i<len;++i)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
二、希尔排序
思想:把一个数组按照增量划分为不同的数据组,对于每一个数据组进行组内排序,通过增量的减小使整个数据组有序
增量的选择规律:1)选择素数 2)最后一个增量必须为1
稳定性:不稳定
时间复杂度:不定 空间复杂度:O(1)
**代码实现**
// 希尔排序
void Shell(int arr[],int len,int dk)//dk:增量
{
int i , j ,tmp;
for(i = dk;i < len; ++i)
{
tmp = arr[i];
for(j = i - dk;j >= 0 && arr[j] > tmp; j = j - dk)
{
arr[j+dk] = arr[j];
}
arr[j+dk] = tmp;
}
}
void ShellSort(int arr[],int arr_len,int dka[],int dka_len)
{
for(int i = 0 ; i< dka_len; ++i)
{
Shell(arr, arr_len, dka[i]);
}
}
int main()//测试用例
{
int arr[] = {1,16,9,6,23,8,12,76,3,1};
int len = sizeof(arr)/sizeof(arr[0]);
int dka[] = {5,3,1};
int dka_len = sizeof(dka)/sizeof(dka[0]);
ShellSort(arr, len, dka,dka_len);
for(int i = 0;i<len;++i)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}