直接插入排序与希尔排序的思想及算法实现
2017-10-11 11:08
309 查看
一、直接插入排序
思想:1)把一个数组分为已排序和未排序的两个部分
2)从未排序的部分取出一个数据,把这个数据暂时存放在临时量中
3)从已排序的部分找到待排序数据的合适位置
4)直接插入该数据
注意:若是数据量非常大的数组排序,则所需移动的次数非常多,效率低下。所以,直接插入排序适用于数据量小,较为有序的数组。
稳定性:稳定
时间复杂度:O(n^2)
空间复杂度:O(1)
**代码实现**
二、希尔排序
思想:把一个数组按照增量划分为不同的数据组,对于每一个数据组进行组内排序,通过增量的减小使整个数据组有序
增量的选择规律: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;
}
思想: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;
}
相关文章推荐
- 算法 -- iOS开发用Objective_C / Swift3.0实现:直接插入排序 / 二分法插入排序 / 希尔排序
- 直接插入排序的算法思想和实现过程
- java实现排序算法之插入排序(直接插入排序,折半插入排序,希尔排序)
- 白话经典算法系列之二 直接插入排序的三种实现
- 白话经典算法系列之二 直接插入排序的三种实现
- java实现排序算法之直接插入排序
- 排序算法总结(冒泡排序、直接插入排序、希尔排序)(python实现)
- 白话经典算法系列之二 直接插入排序的三种实现
- 白话经典算法系列之二 直接插入排序的三种实现
- 【白话经典算法系列之二】 直接插入排序的三种实现
- 白话经典算法系列之二 直接插入排序的三种实现
- 排序--直接插入排序思想及代码实现
- 【数据结构与算法】内部排序之一:插入排序和希尔排序的N中实现(不断优化,附完整源码)
- 一步步学习数据结构和算法之直接插入排序效率分析及java实现
- 算法导论 第2章 算法入门(直接插入排序、希尔排序、冒泡排序、合并排序)
- 白话经典算法系列之二 直接插入排序的三种实现
- 白话经典算法系列之二 直接插入排序的三种实现
- 白话经典算法系列之二 直接插入排序的三种实现
- java实现排序算法之2-路插入排序,直接插入排序,折半插入排序
- 常见的五类排序算法图解和实现(插入类:直接插入排序,折半插入排序,希尔排序)