您的位置:首页 > 其它

直接插入排序与希尔排序的思想及算法实现

2017-10-11 11:08 309 查看
一、直接插入排序

思想: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐