1. 程式人生 > >演算法設計與分析------歸併排序求序列最小值問題

演算法設計與分析------歸併排序求序列最小值問題

題目要求:用分治法實現找一個序列最小值的功能

那我剛學演算法,就引用書上的程式碼寫這個程式。

書籍:《演算法設計與分析》(第2版)

#include<iostream>

using namespace std;
void Merge(int r[],int r1[],int s,int m,int t)//合併子序列
{
int i=s,j=m+1,k=s;
while(i<=m&&j<=t)
{
if(r[i]<=r[j]) r1[k++]=r[i++];//取r[i]和r[j]中較小者放入r1[k]
else r1[k++]=r[j++];
}
while(i<=m)//若第一個子序列沒處理完,則進行收尾處理
r1[k++]=r[i++];
while(j<=t)//若第二個子序列沒處理完,則進行收尾處理
r1[k++]=r[j++];
}
void MergeSort(int r[],int s,int t)//對序列r[s]~r[t]進行歸併排序
{
int m,r1[1000];//陣列r1是臨時陣列,假設最多1000個記錄
if(s==t) return ;//遞迴的邊界條件,只有一個記錄,已經有序
else
{
m=(s+t)/2;//劃分
MergeSort(r,s,m);//求解子問題1,歸併排序前半個子序列
MergeSort(r,m+1,t);//求解子問題2,歸併排序後半個子序列
Merge(r,r1,s,m,t);//合併兩個有序序列,結果存在陣列r1中
for(int i=s;i<=t;i++)//將有序序列傳回陣列r中
r[i]=r1[i];
}

}
int main()

int i,n;
    cout<<"please put number in it:"<<endl;
    int a[10];    
for(i = 0; i < 10; i++)
    {
        cin>>a[i];
    }
cout<<"show the number:"<<endl;
    for( n = 0; n < i; n++) {
        cout<<a[n]<<" ";
    }
cout<<endl;
cout<<"after sorting:"<<endl;
MergeSort(a,0,9);//呼叫歸併演算法進行排序
for( n = 0; n <i; n++) {
        cout<<a[n]<<" ";
    }
cout<<endl;
cout<<"the min is:"<<endl;
cout<<a[0]<<endl;
    return 0;

}

程式執行截圖:

來自一名大二學生的程式設計習作,希望大神勿噴

自己發的第一篇部落格,只想記錄程式設計的點點滴滴