本文目錄一覽:
- 1、c語言裡面,歸併操作怎麼歸併兩個子序列?
- 2、c語言歸併排序
- 3、c語言的歸併排序
- 4、高分送!!如何用C語言實現歸併排序算法!!!
- 5、如何用c語言實現兩個單鏈表的歸併
- 6、C語言 簡單的歸併問題
c語言裡面,歸併操作怎麼歸併兩個子序列?
歸併排序是在多個已經同向排序的序列上進行的,例如:
A數組{2,6}和B數組{5,9}
首先提取兩個數組的首元素比較2和5,發現25,所以從A數組取走2放入新建的C數組,此時A數組中的元素成了{6},然後再次提取兩個數組的首元素比較6和5,發現56,於是,從B數組取走5放入C數組,此時A數組是{6},B數組是{9},C數組是{2,5},同理比較提取下去,直到A數組或者B數組為空,此時把非空數組的元素依次複製到C數組中即完成排序。
c語言歸併排序
直接上源碼,僅供參考:
#includestdio.h
// 一個遞歸函數
void mergesort(int *num,int start,int end);
// 這個函數用來將兩個排好序的數組進行合併
void merge(int *num,int start,int middle,int end);
int main()
{
// 測試數組
int num[10]= {12,54,23,67,86,45,97,32,14,65};
int i;
// 排序之前
printf(“Before sorting:\n”);
for (i=0; i10; i++)
{
printf(“%3d”,num[i]);
}
printf(“\n”);
// 進行合併排序
mergesort(num,0,9);
printf(“After sorting:\n”);
// 排序之後
for (i=0; i10; i++)
{
printf(“%3d”,num[i]);
}
printf(“\n”);
return 0;
}
//這個函數用來將問題細分
void mergesort(int *num,int start,int end)
{
int middle;
if(startend)
{
middle=(start+end)/2;
// 歸併的基本思想
// 排左邊
mergesort(num,start,middle);
// 排右邊
mergesort(num,middle+1,end);
// 合併
merge(num,start,middle,end);
}
}
//這個函數用於將兩個已排好序的子序列合併
void merge(int *num,int start,int middle,int end)
{
int n1=middle-start+1;
int n2=end-middle;
// 動態分配內存,聲明兩個數組容納左右兩邊的數組
int *L=new int[n1+1];
int *R=new int[n2+1];
int i,j=0,k;
//將新建的兩個數組賦值
for (i=0; in1; i++)
{
*(L+i)=*(num+start+i);
}
// 哨兵元素
*(L+n1)=1000000;
for (i=0; in2; i++)
{
*(R+i)=*(num+middle+i+1);
}
*(R+n2)=1000000;
i=0;
// 進行合併
for (k=start; k=end; k++)
{
if(L[i]=R[j])
{
num[k]=L[i];
i++;
}
else
{
num[k]=R[j];
j++;
}
}
delete [] L;
delete [] R;
}
c語言的歸併排序
、歸併簡單點說就是2分法 一直除以2 然後把從0到N/2的下標 , 和 N/2+1 到N的地址傳送到合併函數裡面,遞歸調用
高分送!!如何用C語言實現歸併排序算法!!!
#include iostream
using namespace std;
void merge(int array[],int left,int right)
{
int temparray[right];
for(int j=left;j=right;j++)
{
temparray[j]=array[j];
}
int middle=(left+right)/2;
int index1=left;
int index2=middle+1;
int i=left;
while((index1=middle)(index2=right))
{
if(temparray[index1]temparray[index2]) array[i++]=temparray[index1++];
else array[i++]=temparray[index2++];
}
while(index1=middle) array[i++]=temparray[index1++];
while(index2=right) array[i++]=temparray[index2++];
}
void sort(int array[],int left,int right)
{
if(leftright)
{
int middle=(left+right)/2;
sort(array,left,middle);
sort(array,middle+1,right);
merge(array,left,right);
}
}
這個不是特別的完美,但是大體上就是這麼個思路啦~而且因為語法不嚴謹,貌似只能在c++下運行~建議看看youku上的數據結構課,然後你就會發現全明白了~
如果在c語言下運行,int temparray[right];這句話裡面的right要改成你需要用的數~
如何用c語言實現兩個單鏈表的歸併
函數名、變量名出現了一些C語言的關鍵字,這是不允許的(比如將union作為函數名)
C語言 簡單的歸併問題
描述:這個問題是個類似於歸併排序的問題,相當簡單,只需每次將表中較小的元素提取出來,直至兩表都為空為止,組成的新表即為所求。
核心代碼(處理一組數據):
void fun(int a[],int b[],int n,int m){
/*數據存放在數組c中*/
int i=0,j=0,k=0;
for (k=0;kn+m;k++){
if(i=n||a[i]b[j]) {c[k]=b[j];j++;continue;}
if(j=m||a[i]b[j]) {c[k]=a[i];i++;continue;}
}
}
/*請注意檢查語法錯誤,不過出現的幾率性很小*/
原創文章,作者:GMRK,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/131028.html