超級快排 Ultra QuickSort

2021-09-02 13:42:05 字數 1489 閱讀 9598

題目內容:

在這個問題中,你需要分析特別的演算法。這個演算法通過對乙個包含n個元素的進行操作,一直交換相鄰的兩個序列的元素直到整個序列呈公升序排列。對於輸入序列9 1 0 5 4 ,ultra-quicksort最終得到的輸出為0 1 4 5 9 .你的任務就是來計算出ultra-quicksort 至少需要多少swap操作來最終達到對乙個給定的輸入序列排好序的目標。

輸入格式:

輸入包括多組測試資料。每組測試資料以一行包括乙個單獨的整數n開始(n<500,000,是輸入序列的長度)。每組測試資料接下來的n行包括乙個單獨的整數a[i],a[i]≤ 999,999,999,代表輸入序列第n個元素。輸入以乙個長度n為0的序列終止。這個序列不應該被處理。

輸出格式:

對於每組測試資料,你的程式應該輸入單獨的一行,包括乙個整數op,代表對該輸入序列進行排序所需要最小的交換次數。

輸入樣例:

591

0543

1230

輸出樣例:

6

0

上來看很簡單啊,不就是求逆序對!然後寫了bubble,果然,超時...

然後事情就變得詭異了起來...

用歸併排序找和加,測試了幾個自己編的資料發現沒問題

在mooc平台上跑,超時超時超時*n

於是去網上找,發現和自己差不多啊?歸併啊?把網上的**提交...能過,改了好幾次我的還是過不了

然後想沒啥必要的優化...都不太行

最後發現...是大的迴圈的問題,不能用while(1)

打擾了打擾了

這麼過分一定要發csdn

/*類似求逆序

需要更高效的演算法?

歸併排序還超時??

*/#includeusing namespace std;

int n;

const int maxn = 500001;

int a[maxn];

long long ans=0;

void merge(int *a,int le,int mid,int ri)

else

} while(l<=mid)

while(r<=ri)

for(int i=le,p=0;i<=ri;p++,i++)

delete temp;

}void mergesort(int *a,int le,int ri)

}/*int count_ex(int n)

} if (flag == false)

}return cou;

}*/int main()

mergesort(a,0,n-1);

printf("%d\n",ans);

} return 0;

}

超級排名快排系統介紹

超級排名快排系統介紹 功能簡介 超級排名系統是一款專業的快速提公升關鍵詞排名的系統平台,我們是以谷歌瀏覽器www.cppcns.com為核心的點選優化系統,支援 7 大搜尋,包括 pc端 手機 搜狗pc端 搜狗手機 360pc端 360 手機 神馬搜尋等主流搜尋引擎 效果優勢 不管你是自己的 還是發...

快排2 經典快排和荷蘭國旗快排

基礎知識見 建議先閱讀基礎知識,並自己手推一遍 演算法原理 第一步 取陣列最後乙個數作為num,將陣列中的 num的數放在陣列的左邊,num的數放在陣列的右邊,這是可以理解為分成了兩個陣列 第二步 然後將 num的部分當成乙個陣列,繼續第一步 num的部分同理 第三步 若陣列的大小 2,則結束。流程...

python實現快排演算法 python快排演算法詳解

快排是python經典演算法之一。1 下面講解的是什麼是快排和快排的圖示。2 快排是一種解決排序問題的運算方法。3 快排的原理 在陣列中任意選擇乙個數字作為基準,用陣列的資料和基準資料進行比較,比基準數字打的數字的基準數字的右邊,比基準數字小的數字在基準數字的左邊,第一次排序之後分為比基準資料大或比...