當前位置:首頁 » 編程語言 » 二分排序c語言
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

二分排序c語言

發布時間: 2023-01-31 05:13:25

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];}