您的位置:首页 > 编程语言 > C语言/C++

C实现三种插入排序-简单插入排序、二分插入排序、希尔插入排序

2014-11-25 19:23 288 查看
想必各种数据结构和算法的书上均有相关的介绍。我就在啰嗦一下,随便侃侃,各位有砖扔砖,没砖低头找找。

 

1、 简单插入排序。最原始的插入排序,不多说,直接上码。

void insertSort(int *array,int len)
{
if(NULL == array|| 1 == len) return; //检测还是要的
int i,j;
for(i = 1;i<len;i++) //这里只需要记得需要插入多少个就行,显然插入len-1个元素,把第一个当成有序数组(也是插入排序的核心思想)
{
if(array[i - 1]>array[i])
{
int temp = array[i];
for(j = i -1;array[j] > temp;j--)
{
array[j + 1] =  array[j];
}
array[j+1] = temp;
}
}
}


2、二分插入排序——各位应该听得耳朵茧子都有。这个算法,是对于简单排序排序算法的优化,优化的什么呢——当然是加快查找被插入元素的位置!省去多次的比较

void biInsertSort(int *array,int len)
{
if(NULL == array|| 1 == len) return;
int i,j;
for(i = 1;i<len;i++)
{
if(array[i - 1]>array[i])
{
int temp = array[i];
int low = 0;
int high = i - 1;
while(low<high) //就是这儿,优化一下,总是好的
{
int mid = (low + high)/2;
if(array[mid] > temp)
{
high = mid - 1;
}else{
low = mid + 1;//注意这个地方,可不是low = mid,因为我们不是要查找相等的元素(与二分查找还是有区别的)
}
}
for(j = i - 1;j >= low;j--)
{
array[j + 1] =  array[j];
}
array[low] = temp;
}
}
}


3、希尔插入排序。这个我不是很清楚该算法优化的是哪个方面,不过对于大数组来说应该效率要好些。因为它是逐渐有序的,越往后面,需要进行交换和比较的次数相对少一些,而上面两个往后面,交换的次数会越来越多。就扯这么多,上码。

void shellSort(int *array,int len,int dk)
{
if(NULL == array|| 1 == len) return;
int i,j;
for(i = dk;i<len;i++)
{
if(array[i - dk]>array[i])
{
int temp = array[i];

for(j = i - dk;(j>=0)&&(array[j]>temp);j-=dk)
{
array[j + dk] =  array[j];
}
array[j+dk] = temp;
}
}
}

void ShellSort(int *array,int len,int dk)
{
int i;
for(i = dk;i>0;i--)
{
shellSort(array,len,i);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐