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

c語言實現折半排序演算法

發布時間: 2022-08-01 23:13:20

『壹』 請寫一個折半插入排序演算法(最好用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;
}

『貳』 用折半插入排序方法寫出程序,完成數字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

『叄』 C語言折半插入排序


修改好了。
你的主要錯誤是一個j--寫成了j++. 此外,我給你加了一點檢查的代碼。
此外,count的值是0,你沒有統計它,你自己再修改一下。

#include <stdio.h>

main()
{
int a[101],b[101],con,count = 0,i,j,t,n,m=0; /*count用來記錄計算次數,a數組是輸入數組,b數組時排序以後數組,con用來標記看a數組中的數字是否找到相應的位置,m用來表示b數組長度*/
scanf ("%d",&n);
for ( i = 0;i < n; i++) /*輸入數據*/
scanf ("%d",&a[i]);
b[0] = a[0];
m = 1;

for (i = 1;i < n;i++)
{
j = m / 2;
con = 1;
t = compare ( a[i],&b[j],&count,&con,&m,&j); /*conpare函數用來尋找a中數字插入的位置*/
if (t == 200) { /* check abnormal return */
printf("unexpected error\n");
exit(1);
}
printf("m = %d, t = %d\n", m, t);
for (j = m;j > t;j--) /*找到位置以後重新排序*/ // j--, not j++
b[j] = b[j-1];
b[t] = a[i];
if ( t != 200)
m = m+1;
}

printf("The sorted array:\n");
for (i = 0;i < m;i++)
printf ("%d ",b[i]);
printf ("\b\ncount: %d\n",count);
printf("press any key to exit\n");
getch();
}

int
compare (a,b,count,con,m,j) /*j表示所插入的位置*/
int a,*b,*count,*con,*m,*j;
{
int i,k = 0;
if (a > *b)
{
*con = 2 * (*con); /*用整除的方式表示,能被2整除,說明有過比a小的數字,能被3整除說明比較過比a大的數字,而當a在比它比它小的數之間時,被六整除,可以得到所求的位置*/
i = 1;
*j = *j + 1;
}
if (a < *b)
{
*con = 3 * (*con);
i = -1;
*j = *j -1;
k = 1;
}
if (a == *b)
return 200; /*返回值為200說明有數字相同,重新排序操作*/
if (*con % 6 == 0 || *j == -1 || *j == *m) /*當j過大或者過小的時候把數字排列在最左邊或者最右邊,返回主函數*/
return (*j + k);
else return compare (a,b+i,count,con,m,j); /*當還沒找到所需要位置的時候,再次使用該函數找到位置*/
}

『肆』 用c語言,折半插入排序10個隨機數,主體插入排序,查找位置採用折半查找的方法。

教材上有寫:折半插入排序基本思想和直接插入排序一樣,區別在於尋找插入位置的方法不同,折半插入排序採用折半查找法來尋找插入位置。折半查找法只能對有序的序列使用。基本思想就是查找插入位置的時候,把序列分成兩半(選擇一個中間數mid),如果帶插入數據大於mid則到右半部分序列去在進行折半查找;反之,則到左半部分序列去折半查找。
折半插入排序在記錄移動次數上和直接插入排序是一樣,所以演算法時間復雜度也是一樣,只是在尋找插入位置的時候可能會節約相當多的時間。

『伍』 請寫一個折半插入排序演算法(最好用C語言寫出來,只要求寫一個函數)。

折半插入排序演算法:

//創建鏈表
StatusEnSqList(SqList*L,ElemTypee,intn)
{
if(L->length>=n)
returnERROR;
L->data[L->length+1]=e;
L->length++;
returnOK;
}

//折半插入排序演算法
voidBInsertSort(SqList*L)
{
inti,j,mid,high,low;
for(i=2;i<=L->length;i++)
{
low=1;
high=i-1;
L->data[0]=L->data[i];
while(low<=high)
{
mid=(low+high)/2;
if(L->data[0]<L->data[mid])
high=mid-1;
else
low=mid+1;
}
for(j=i-1;j>=high+1;j--)
L->data[j+1]=L->data[j];
L->data[high+1]=L->data[0];
}
}

intmain(void)
{
SqListL;
intn,i;
ElemTypee;
L.length=0;
printf("輸入元素個數:");
scanf("%d",&n);
L.data=(int*)malloc(sizeof(int)*n);
printf("輸入各個元素的值:");
for(i=0;i<n;i++)
{
scanf("%d",&e);
EnSqList(&L,e,n);
}
BInsertSort(&L);
for(i=1;i<=n;i++)
printf("%d",L.data[i]);
printf(" ");
return0;
}

『陸』 c語言編程實現「折半查找」的過程。

折半查找的演算法思想是將數列按有序化(遞增或遞減)排列,查找過程中採用跳躍式方式查找,即先以有序數列的中點位置為比較對象,如果要找的元素值小於該中點元素,則將待查序列縮小為左半部分,否則為右半部分。通過一次比較,將查找區間縮小一半。 折半查找是一種高效的查找方法。它可以明顯減少比較次數,提高查找效率。但是,折半查找的先決條件是查找表中的數據元素必須有序。參考程序,希望對你有所幫助!
#include<stdio.h>
void main()
{
int a[20],x,i,start,end;
printf("input 20 numbers:\n");
for(i=0;i<20;i++) scanf("%d",&a[i]);
printf("please enter the number:\n");
scanf("%d",&x);
for(start=0,end=19;start<=end;)
{
i=start+(end-start)/2;
if (x==a[i])
{
printf("%d",i+1);
getch();
return;
}
else if (x>a[i]) end = i-1;
else start=i+1;
}
}

『柒』 用c語言寫一個演算法(折半或二分法),實現可以選擇1到20的從小到大以

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

第一步: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

『捌』 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;
}