1. 程式人生 > 其它 >歸併 快排

歸併 快排

技術標籤:筆記

總時間限制: 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;
}