int partition(int*a,int,int);
void qsort(int*a, int,int);
void swap(int &,int &);
int main()
{ //測試代碼
int num;
cout << "輸入數組個(gè)數\n";
cin >> num;
int *a = new int [num];
cout << "輸入數組元素\n";
for(int i = 0;i <num;i++)
{
cin >> a[i];
}
qsort(a,0,num);
for(int i = 0;i<num ;i++)
{
cout << "a[" << i << "] = " << a[i] << endl;
}
system("pause");
return 0;
}
void qsort(int* a,int l,int r)
{
if(l<r){
int i = partition(a,l,r);
qsort(a,l,i-1); //對左半段排序
qsort(a,i+1,r); //對右半段排序
}
}
int partition(int *a,int l,int r)
{
int i,j,temp;
i=l;j=r;
temp=a[i];
do{
while((a[j]>temp) && (i<j))
j--;
if(i<j)
swap(a[i++],a[j]);
while((a[i]<=temp) && (i<j))
i++;
if(i<j)
swap(a[j--],a[i]);
}while(i!=j);
a[i]=temp;
return i;
}
void swap(int &a,int &b)
{
int temp = a;
a = b;
b = temp;
}
歸并排序(merge sort):對一個(gè)數組進(jìn)行排序,可以將之分解為n個(gè)已經(jīng)排序的子問(wèn)題,然后進(jìn)行合并就可以得到了原問(wèn)題的解。分治法的基本思想是將一個(gè)規模為n的問(wèn)題分解為k個(gè)規模較小的子問(wèn)題,這些子問(wèn)題相互獨立且與原問(wèn)題相同。遞歸的解這些子問(wèn)題,然后將個(gè)子問(wèn)題的解合并得到原問(wèn)題的解。分為三步:
1)把大的問(wèn)題分解成小的問(wèn)題:MergeSort;
2)把兩個(gè)較小的子問(wèn)題合并成一個(gè)較大的問(wèn)題:Merge;
3)對已排序數組進(jìn)行拷貝:Copy;
C++實(shí)現代碼 msort.cpp
#include <iomanip.h>
#include <iostream.h>
//這個(gè)函數將b[0]至b[right-left+1]拷貝到a[left]至a[right]
void Copy(int a[],int b[],int left,int right)
{
int size=right-left+1;
for(int i=0;i<size;i++)
{
a[left++]=b[i];
}
}
//這個(gè)函數合并有序數組a[left:i],a[i+1:right]到b,得到新的有序數組b
void Merge(int a[],int b[],int left,int i,int right)
{
int a1cout=left,//指向第一個(gè)數組開(kāi)頭
a1end=i,//指向第一個(gè)數組結尾
a2cout=i+1,//指向第二個(gè)數組開(kāi)頭
a2end=right,//指向第二個(gè)數組結尾
bcout=0;//指向b中的元素
for(int j=0;j<right-left+1;j++)//執行right-left+1次循環(huán)
{
if(a1cout>a1end){b[bcout++]=a[a2cout++];continue;}//如果第一個(gè)數組結束,拷貝第二個(gè)數組的元素到b
if(a2cout>a2end){b[bcout++]=a[a1cout++];continue;}//如果第二個(gè)數組結束,拷貝第一個(gè)數組的元素到b
if(a[a1cout]<a[a2cout]){b[bcout++]=a[a1cout++];continue;}//如果兩個(gè)數組都沒(méi)結束,比較元素大小,把較小的放入b
else
{b[bcout++]=a[a2cout++];continue;}
}
}
//對數組a[left:right]進(jìn)行合并排序
void MergeSort(int a[],int left,int right)
{
int *b=new int[right-left+1];
if(left<right){
int i=(left+right)/2;//取中點(diǎn)
MergeSort(a,left,i);//左半邊進(jìn)行合并排序
MergeSort(a,i+1,right);//右半邊進(jìn)行合并排序
Merge(a,b,left,i,right);//左右合并到b中
Copy(a,b,left,right);//從b拷貝回來(lái)
}
}
int main()
{ //測試代碼
int num;
cout << "輸入數組個(gè)數\n";
cin >> num;
int *a = new int [num];
cout << "輸入數組元素\n";
for(int i = 0;i <num;i++)
{
cin >> a[i];
}
MergeSort(a,0,num);
for(int i = 0;i<num ;i++)
{
cout << "a[" << i << "] = " << a[i] << endl;
}
system("pause");
return 0;
}
聯(lián)系客服