当前位置:首页 » 操作系统 » 折半排序算法

折半排序算法

发布时间: 2024-02-05 11:15:41

1. 请写一个折半插入排序算法(最好用c语言写出来,只要求写一个函数)

/***折半插入排序***/
/*算法原理:从第二个数开始逐个置入监视哨,使用low,high标签在L[0..i-1]有序区内进行折半查找
来确认待排序数的插入位置,然后将该位置到最后一个数全部后移一位,最后腾出该位置,
把监视哨里面的数置入该位置。后面的数以此类推进行排序,直到最后一个数比较完毕。
*/
#include<stdio.h>
voidbinaryInsertSort(intL[],intn)
{
inti,j;
intlow,high,mid;
//用L[0]作为监视哨,L[1..i-1]为有序区,
for(i=2;i<=n;i++)
{
L[0]=L[i]; //待排序的数进监视哨
low=1;
high=i-1; //初始化low,high
while(low<=high)//循环语句确定插入位置,必须保证low<=high
{
mid=(low+high)/2;
if(L[0]<L[mid])//根据L[0]的值的大小,确定属于低半区还是高半区
high=mid-1;//插入低半区//插入低半区
else
low=mid+1;//插入高半区
}
for(j=i-1;j>=high+1;j--)//待插入位置后面L[hign+1..i-1]全部数后移一位
L[j+1]=L[j];
L[high+1]=L[0]; //或者换成L[j+1]=L[0];监视哨里面的数插入数组
}
}

voidbinaryInsertSort1(intL[],intn)
{
inti,j;
intlow,high,mid,tmp;
//用临时变量tmp作为监视哨,L[0..i-1]为有序区
for(i=1;i<n;i++)
{
tmp=L[i];
low=0;
high=i-1;
while(low<=high)
{
mid=(low+high)/2;
if(tmp<L[mid])
high=mid-1;
else
low=mid+1;
}
for(j=i-1;j>=high+1;j--)
L[j+1]=L[j];
L[high+1]=tmp;
}
}

intmain()
{
inti,n;
inta[50];
printf("输入n=");
scanf("%d",&n);
printf("输入数组元素: ");
// for(i=1;i<=n;i++)
for(i=0;i<n;i++)
scanf("%d",&a[i]);
// binaryInsertSort(a,n);
binaryInsertSort1(a,n-1);
printf("排序后; ");
// for(i=1;i<=n;i++)
for(i=0;i<n;i++)
printf("%-4d",a[i]);
putchar(10);
return0;
}

2. c语言中的折半排序法是怎样的,基本程序是怎样的

折半法
应该叫做2分法。
用2分法查找数
需要先对数组进行排序(升序或降序)
假如你所要查找的数是20
数组是 1 4 7 8 20 30 34
每次都拿中间的数跟你要比的数比
也就是 8和20比
发现20比8大
所以左面的数都不要了
剩下的是 20 30 34
再拿20跟30比
发现20比30小
右面的数都不要了
再拿20跟20比
相等,则找到了。
如果找不到返回-1
下面是程序。

#include <iostream>
using namespace std;

int binarySearch(int* data,int low,int high,int value)
{

int k=(low+high)/2;

if(value<*(data+low)||value>*(data+high))
{
return -1;
}

if(value<*(data+k))
{
return binarySearch(data,low,k-1,value);
}

else if(value>*(data+k))
{
return binarySearch(data,k+1,high,value);
}

else
return k;

}

void main()
{
int pos;
int arr1[9]={1,2,3,4,5,6,7,8,9};
int i=9;
while(i)
{
pos=binarySearch(arr1,0,8,i);
cout<<"数字"<<i<<"的下标是:"<<pos<<endl;
i--;
}

pos=binarySearch(arr1,0,8,20);
cout<<"数字20的下标是:"<<pos<<endl;
}

3. 用折半插入排序方法写出程序,完成数字12在数列(1,6,9,13,20,29)的排序工作(C语言)

解:用有序列插入法排序,过程如下:

第一步:7  1      (前两个数7,1排成有序列)

第二步:7  3  1    (第3个数3按要求插入到已排好的有序列中)

第三步:12  7  3  1    (第4个数12按要求插入到已排好的有序列中)

第四步:12  8  7  3  1    (第5个数8按要求插入到已排好的有序列中)

第五步:12  8  7  4  3  1    (第6个数4按要求插入到已排好的有序列中)

第六步:12  9  8  7  4  3  1    (第7个数9按要求插入到已排好的有序列中)

第八步:12  10  9  8  7  4  3  1    (第8个数10按要求插入到已排好的有序列中)

这时各数的顺序就是符合要求的最终顺序.

用折半插入排序法,将新数据6插入到上面的有序列中,算法步骤设计如下:

第一步:把新数据6与“中间位置”的数据8比较,由于6<8,所以应将6放到8的右边的一半有序列中,即应放到有序列7,4,3,1中.

第二步:把6与有序列7,4,3,1“中间位置”的数据4比较,由于4<6,所以应将6放到4的左边的一半有序列中,即应放到有序列7,4中.

第三步:把6与有序列7,4“中间位置”的数据7比较,由于7>6,所以应将6放到7的右边的一半有序列中,至此排序完成,得到一新的有序列

12,10,9,8,7,6,4,3,1

热点内容
广数编程p 发布:2024-11-28 20:38:37 浏览:665
sql2008vs2010 发布:2024-11-28 20:38:34 浏览:373
编译plc程序 发布:2024-11-28 20:28:49 浏览:916
母婴源码 发布:2024-11-28 20:23:13 浏览:299
ftp标题下划线怎么添加 发布:2024-11-28 20:23:09 浏览:793
电脑金铲铲之战服务器已满怎么办 发布:2024-11-28 20:09:58 浏览:618
脚本六要素 发布:2024-11-28 19:41:07 浏览:986
linuxoralce 发布:2024-11-28 19:39:51 浏览:608
4k存储量 发布:2024-11-28 19:39:36 浏览:825
php动态链接 发布:2024-11-28 19:34:16 浏览:151