① c语言 帮忙写一个二分排序的程序代码
void sort(int* a, int n){
//当分组中的数据是1个或0个时,分组结束
if(n<=1)return;
//将数据分成两个组
int L,R;
L = 0;
R = n-1;
while(L<R){
while(L<R&&a[L]<=a[R]) R--;
swap(a[L], a[R]);
while(L<R&&a[L]<=a[R]) L++;
swap(a[L], a[R]);
}
//对左边的组再进行分组
sort(a, L);
//对右边的组再进行分组
sort(a+L+1,n-L-1);
}
② C语言怎么用二分查找插入排序
进行二分查找的前提是数组已排序,这里假定数组递增排序。
每次查找都将待查找数num与处于数组中间位置a[mid]的数进行比较,num < a[mid]则在mid之前的元素中进行查找,反之在mid之后的元素中进行查找。
在函数中使用low, mid, high来对待查找的范围来进行标记。
参考代码如下:
/*整数查找*/
voidbinsearch(intnum,inta[],intlength)/*num为待查找数字,length为数组a的长度*/
{
intlow,mid,high;
low=0;
high=length-1;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]>num)
high=mid-1;
elseif(a[mid]<num)
low=mid+1;
else
returnmid;
}
return-1/*未查找到num返回-1*/
}
③ C语言 二分法查找 排序问题
a.txt:读入数据
b.txt: 写入排序数据
c.txt: 写入查找结果
#include<stdio.h>
constintmaxn=1000;
intnum[maxn],n;
voidswap(int*x,int*y){
*x^=*y;
*y=*x^*y;
*x=*x^*y;
}
voidfinput(){
printf("-------- readdatafroma.txt -------- ");
FILE*fin=fopen("a.txt","r");
n=0;
while(fscanf(fin,"%d",&num[n])!=EOF){
n++;
}
fclose(fin);
}
voidbubble(){
printf("-------- startbubblingsortalgorithm ");
for(inti=n-1;i>0;--i){
for(intj=0;j<i;++j){
if(num[j]>num[j+1]){
swap(&num[j],&num[j+1]);
}
}
}
printf("writetheresultofsortinb.txt -------- ");
FILE*fout=fopen("b.txt","w");
for(inti=0;i<n;++i){
fprintf(fout,"%d ",num[i]);
}
fclose(fout);
}
intrbesearch(intlow,inthigh,intv){
//recursivebinarysearch
//returntheindexofv.ifnotexists,return-1.
if(low==high){
if(num[low]==v)returnlow;
return-1;
}
if(num[low]==v)returnlow;
intmid=(low+high)/2;
if(num[mid]<v){
returnrbesearch(mid+1,high,v);
}
else{
returnrbesearch(low,mid,v);
}
}
intnrbesearch(intlow,inthigh,intv){
//non-recursivebinarysearch
//returntheindexofv.ifnotexists,return-1.
while(low<high){
intmid=(low+high)/2;
if(num[mid]<v){
low=mid+1;
}
else{
high=mid;
}
}
if(low==high&&num[low]==v){
returnlow;
}
return-1;
}
voidsearch(){
printf("-------- ");
printf("Startsearch. ");
printf("Theresultswillbewritteninc.txt ");
printf("pleaseinputanum.ifnum=-123456,quit. ");
FILE*file=fopen("c.txt","w");
while(true){
intv;
scanf("%d",&v);
if(v==-123456)break;
intrb=rbesearch(0,n-1,v);
intnrb=nrbesearch(0,n-1,v);
fprintf(file,"input:%d ",v);
fprintf(file,":%d ",rb);
fprintf(file,"theresultofnon-recursivebinarysearch:%d ",nrb);
printf(":%d ",rb);
printf("theresultofnon-recursivebinarysearch:%d ",nrb);
}
fclose(file);
}
intmain(){
finput();
bubble();
search();
return0;
}
④ c语言如何实现-数组排序,二分查找
给定已经排好序的n个元素,现在要在这n个元素中找出一特定元素x。顺序搜索的方法是逐个比较,直至找出元素。二分搜索则利用了元素间的次序关系,可大大提高效率。二分法的基本思想是将n个元素分成个数大致相同的两半,取a[n/2]与x作比较。如果x==a[n/2],则终止。如果x<a[n/2],则只需在数组的左半部分继续搜索。如果x>a[n/2],则只需在右半部分搜索。本题要求利用上一题得到的数组进行顺序查找和二分查找,分别为两种查找方法计时。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void xuanzhe(int a[], int n)
{
int i, j, min, t;
for (i=0; i<n-1; i++) /*要选择的次数:0~n-2共n-1次*/
{
min = i; /*假设当前下标为i的数最小,比较后再调整*/
for (j=i+1; j<n; j++)/*循环找出最小的数的下标是哪个*/
{
if (a[j] < a[min])
{
min = j; /*如果后面的数比前面的小,则记下它的下标*/
}
}
if (min != i) /*如果min在循环中改变了,就需要交换数据*/
{
t = a[i];
a[i] = a[min];
a[min] = t;
}
}
}
int main(){
int i,n,x;
int mid,left=0,right=999;
int find1=0,find2=0;
double y;
int a[1000];
for(i=0;i<1000;++i){
a[i]=rand();
}
xuanzhe(a,1000);
scanf("%d",&x);
printf("顺序查找:\n");
for(i=0;i<1000;++i){
while(x==a[i]){
printf("找到X=%d,a[%d]\n",x,i);
find1=1;
break;
}
}
if(find1==0){
printf("没有你要找的数\n");
}
printf("%fs\n",clock()/CLOCKS_PER_SEC);
y=clock();
printf("二分查找:\n");
while(!find2&&left<right)
{
mid=(left+right)/2;
if(x==a[mid])
find2=1;
else if(x<a[mid])
right=mid-1;
else left=mid+1;
}
if(find2==1)
printf("找到x=%d ,a[%d]\n",x,mid);
else
printf("没有你要找的数\n");
printf("%fs\n",(clock()-y)/CLOCKS_PER_SEC);
}
⑤ C语言二分法编程问题
/* 二分法插入排序的算法源程序*/
#include<stdio.h>
#define MAXNUM 100
typedef int KeyType;
typedef int DataType;
typedef struct {
KeyType key; /* 排序码字段 */
/*DataType info; 记录的其它字段 */
} RecordNode;
typedef struct {
int n; /* n为文件中的记录个数,n<MAXNUM */
RecordNode record[MAXNUM];
} SortObject;
void binSort(SortObject * pvector) { /* 按递增序进行二分法插入排序 */
int i, j, left, mid, right;
RecordNode temp;
RecordNode *data = pvector->record;
for( i = 1; i < pvector->n; i++ ) {
temp = data[i];
left = 0; right = i-1; /* 置已排序区间的下、上界初值 */
while (left <= right) {
mid = (left + right)/2; /* mid指向已排序区间的中间位置 */
if (temp.key < data[mid].key)
right = mid-1; /* 插入元素应在左子区间 */
else left = mid+1; /* 插入元素应在右子区间 */
}
for (j = i-1; j >= left; j--)
data[j+1] = data[j]; /* 将排序码大于ki的记录后移 */
if (left != i) data[left] = temp;
}
}
SortObject vector={10, 49,38,65,97,76,13,27,49,50,101};
int main(){
int i;
binSort(&vector);
for(i = 0; i < vector.n; i++)
printf("%d ", vector.record[i]);
getchar();
return 0;
}
⑥ 这是C语言求二分插入排序的程序,有问题,求教,急急急!!!
#include<stdio.h>
intmain()
{
inta[11];//a[0]作为哨兵,从a[1]到a[10]是真正数据
intlow,mid,high;
intx;
inti,j,n;
n=10;
for(i=1;i<=n;i++)
{
a[i]=0;
}
i=1;
printf(" 要插入的数是(还有%d个):",n+1-i);
scanf("%d",&x);
a[i]=x;
printf("x=%d ",x);
printf("排列后");
for(j=1;j<=n;j++)
{
printf("%d",a[j]);
}
printf(" ");
for(i=2;i<=n;i++)
{
printf(" 要插入的数是(还有%d个):",n+1-i);
scanf("%d",&x);
a[i]=x;
a[0]=a[i];//a[0]作为哨兵
low=1;
high=i-1;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]>a[0])
{
high=mid-1;
}
else
{
low=mid+1;
}
}
//通过上述的折半查找,得出high值
//数据往后移动
for(j=i-1;j>=high+1;j--)
{
a[j+1]=a[j];
}
//a[0]就是x,将x插入正确的位置
a[high+1]=a[0];
printf(" x=%d ",x);
printf("排列后");
for(j=1;j<=n;j++)
{
printf("%d",a[j]);
}
printf(" ");
}
printf(" 我是答案;");
for(i=1;i<=n;i++)
{
printf("%d",a[i]);
}
return0;
}
⑦ C语言 折半排序法(二分排序法)求大神补充,急需
intTwoPointsRanking(intarray[],intnum,size_tsize,intmax){
intleft=0;
intright=size-1;
intmiddle=0;
intmoveindex=0;
do{
if(size==max){
return-1;
}
if(size==0){
array[0]=num;
}else{
while(left<=right){
middle=(left+right)/2;
if(num<array[middle]){
right=middle-1;
}else{
left=middle+1;
}
}
for(moveindex=size-1;moveindex>=left;moveindex--)
{
array[moveindex+1]=array[moveindex];
}
array[left]=num;
}
}while(0);
return0;
}
#defineMAX5
intmain(intargc,char*argv[]){
intarray[MAX];
intinput=0;
size_tsize=0;
size_tindex=0;
do{
printf("输入:");
scanf("%d",&input);
if(input==0){
printf("退出 ");
break;
}
if(TwoPointsRanking(array,input,size,MAX)==-1){
printf("已满 ");
break;
}
size++;
for(index=0;index<size;index++)
printf("%d",array[index]);
printf(" ");
}while(1);
return0;
}
⑧ C语言二分法插入已排序的数组中
#include<stdlib.h>
void sort(int a[],int n){ /*排序函数,要使用二分法查找就必须对数组进行排序*/
int i,k;
for(i=0;i<n;i++){
int min=i;
for(k=i+1;k<n;k++)
if(a[min]>a[k])min=k;
if(i!=min){
a[min]+=a[i];/*这里是运用加减法交换两个数*/
a[i]=a[min]-a[i];
a[min]-=a[i];
}
}
}int find(int a[],int n,int key){/*二分法查找;参数:数组名,数组长度,查找关键字*/
int min=0,max=n-1;/*二分法查找头尾变量*/
while(min<max){/*如果最头的变量值大于最尾变量的值,则查找不到,查找失败*/
int cen = (min+max)/2;
if(a[cen]==key) return cen;/*如果查到,则返回关键字在排序数组的下标*/
if(cen==min || cen==max)break;/*如果中间变量等于头尾任一个变量,同样查找失败*/ if(a[cen]>key) max=cen;
else min=cen; }
return -1;
}
void main(){/*主程序只是为了证明两个函数的可行性,可以自己编写*/
int a[]={14,10,25,36,87,95,10,12,13,8},i;
sort(a,10);
i=find(a,10,11);
if(i!=-1)
printf("be found");
else
printf("no found");
getch();
}
⑨ 二分排序的简介
c语言代码如下: #includestdio.hvoidmain(){intn=5;inta[5]={81,60,51,35,73};intq=n,m,p,s,k,i=0,temp;while(q){p=n;while(p){k=p,m=0,s=1;while(k/2){k=k/2;m++;}while(k<=m){s=s*2;k++;}i=s-1;while(i+s<n){if(a[i+s]<a[i]){temp=a[i+s];a[i+s]=a[i];a[i]=temp;}elseif(a[i+s]>a[i+s+1]&&(i+s+1)<n){temp=a[i+s];a[i+s]=a[i+s+1];a[i+s+1]=temp;}i++;}p=p/2;}q=q/2;}for(i=0;i<n;i++)printf(%d,,a[i];}