歸併 快排
阿新 • • 發佈:2020-12-27
技術標籤:筆記
總時間限制: 10000ms 單個測試點時間限制: 1000ms 記憶體限制: 65536kB
描述
對一組無序的整數用歸併法進行排序。
輸入
第一行為數列的總個數,第二行為待排序的數列
輸出
排序後的數列
#include<iostream>
#include<algorithm>
using namespace std;
void Merge(int length,int First1,int Last1,int Last2,int data[])
{
int *temp=new int[length];
int i=First1,j=Last1+ 1,k=First1;
while(i<=Last1&&j<=Last2)
{
if(data[i]<=data[j])
temp[k++]=data[i++];
else
temp[k++]=data[j++];
}
while(i<=Last1)
temp[k++]=data[i++];
while(j<=Last2)
temp[k++]=data[j++];
for(i=First1; i<=Last2;i++)//把結果傳回陣列
data[i]=temp[i];
delete[] temp;
}
void Sort(int length,int First,int Last,int data[])
{
if(First==Last) return ;
else
{
int mid=(First+Last)/2;
Sort(length,First,mid,data);
Sort(length,mid+1,Last,data);
Merge(length,First, mid,Last,data);
}
}
int main()
{
int n,a[3000];
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
Sort(n,0,n-1,a);
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
描述
對一組無序的整數用快速排序法進行排序
輸入
第一行為數列的總個數,第二行為待排序的數列
輸出
排序後的數列
#include<iostream>
#include<algorithm>
using namespace std;
int Part(int First,int Last,int data[])
{
int i=First,j=Last;
while(i<j)
{
while(i<j&&data[i]<=data[j])
j--;//右側掃描
if(i<j)
{
swap(data[i],data[j]);
i++;
}
while(i<j&&data[i]<=data[j])
i++;//左側掃描
if(i<j)
{
swap(data[i],data[j]);
j--;
}
}
return i;
}
void Sort(int First,int Last,int data[])
{
if(First>Last) return ;
else
{
int privot=Part(First,Last,data);
Sort(First,privot-1,data);
Sort(privot+1,Last,data);
}
}
int main()
{
int n,a[3000];
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
Sort(0,n-1,a);
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}