排序演算法總結

2021-09-26 16:34:30 字數 3166 閱讀 7453

問題 i: 【排序】找中間數

題目

輸出一組資料的中位數,輸入的資料ai(10-20

20)注意

1)直接sort是不行的:因為浮點數的大小判斷是有誤差的,而sort裡面是直接用a>b這種模式來判斷的

2)所以自己寫乙個sort的排序判斷(小技巧)

bool cmp

(double a,

double b)

問題 u: 【排序】奶牛的編號

題目:

有n(1≤n≤1000)頭奶牛,它們都被標上乙個優先等級編號:1,2或3。用來表示它們喝水時的優先次序,編號為l的最優先,編號為2的其次,編號為3的最後。每天奶牛開始時排成一行,但總是很亂,需要你把它們重新排成編號為1的奶牛在最前面,編號為2的其次,編號為3的奶牛在最後。你能計算出最少需要多少的交換次序來完成這次重排嗎?

思路

1)先算出三個區域的區間範圍,然後先後掃瞄1,2所在的區間[p,q],[q+1,r]

2)以1的區間[p,q]為例,若a[i]==2不為1,就去[q+1,r]裡面找是否有等於1的,有:交換,ans++,無:去[r+1,n]找,然後交換

若a[i]==3則去[r+1,n]中找是否有等於1的,有:交換,ans++,無:去[p+1,q]找,然後交換

#include

#include

using namespace std;

intmain()

int ans=0;

for(

int i=

0;iif(

!flag)}}

}if(a[i]==3

)}if(

!flag)}}

}}}for

(int i=sign1;i}}

cout << ans << endl;

}return0;

}

問題 l: 【排序】水王爭霸

注意

1)本題系統的sort出問題了,自己寫的bubbl sort

2)字串可能有前導的0,要考慮這一點

問題 s: 【排序】集合

題目

給定兩個集合a、b,集合內的任一元素x滿足1≤x≤109,並且每個集合的元素個數不大於105。我們希望求出a、b之間的關係。

給定兩個集合的描述,判斷它們滿足下列關係的哪一種:

a是b的乙個真子集,輸出「a is a proper subset of b」;

b是a的乙個真子集,輸出「b is a proper subset of a」;

a和b是同乙個集合,輸出"a equals b」;

a和b的交集為空,輸出"a and b are disjoint」;

上述情況都不是,輸出「i』m confused!」。

思路

排序,二分

問題 r: 【排序】琦琦的藝術**

題目:

琦琦是乙個漂亮的小女孩,。很多人都說她像洋娃娃。有一天,她還把自己的藝術照拿回幼兒園向小朋友炫耀,也許是因為琦琦的藝術照太漂亮,很多小朋友都找她要藝術**,那些**可是非常珍貴的,她到底應該把**給誰呢?

一共有n個人(以1~n編號)向琦琦要**.而琦琦只能把**給其中的k個人。琦琦按照與他們的關係好壞程度給每個人賦予了乙個初始權值w[i]。然後將初始權值從大到小進行排序,每人就有了乙個序號d[i](取值同樣是1~n)。按照這個序號對10取模的值將這些人分為10類。也就是說定義每個人的類別序號c[i]的值為(d[i]-1)mod 10+1,顯然類別序號的取值為l~10。第i類的人將會額外得到e[i]的權值。你需要做的就是求出加上額外權值以後,最終的權值最大的k個人,並輸出他們的編號。權值都是正整數。在排序中,如果兩人的w[i]相同,編號小的優先。

輸入共3行:

第1行輸出用空格隔開的兩個整數,分別是n (o問題 t: 【排序】誰會贏?

時間限制: 3 sec 記憶體限制: 64 mb

題目

最近,在課餘時間流行一種遊戲,遊戲的規則如下:遊戲開始時,每個人都從規定範圍內的數中選取乙個數(保證所選取的數各不相同),寫在紙上,握在手中(以防讓別的同學看見),然後同時開啟,如果其中乙個同學手中的數是其他任意兩位同學手中的數之和,那麼他就贏,如果滿足條件的有多個,手中的數最大的那位同學贏。這是心理和智力的雙重考驗,所以參加的學生越來越多,但是,由於參與人數眾多,要判斷誰贏就成了問題,請聰明的你設計乙個程式來解決這個問題!

輸入第1行為乙個整數n(3≤n≤50000),表示參加遊戲的總人數,第2行為n個數(範圍在0~2^31之間),依次表示n個同學所選的數,第i個數表示第i位同學所選的數。

輸出只一行,為乙個整數,表示哪位同學贏。如果沒有任何一位同學贏,則輸出「0」。

思路

一開使用map將所有情況存下來,再查詢會爆記憶體;後來遍歷出所有情況(不存)然後在給出的數裡面二分,超時(~ _ ~)

後來使用map記錄下所有的出現的數,然後兩個for,求出兩個數w[i],w[j]的差x看看map[x]是否為1還有以下幾個判斷條件,是就輸出

注意

輸出的條件還有 m[w1-w2]==1 && w1 != w2 * 2 && w2 != 0,w1不能是w2的兩倍,w2不能為0

#include

#include

#include

#include

#include

#include

using namespace std;

const

int maxn=

5e5+5;

struct node

w[maxn]

;bool cmp

(node a,node b)

map<

int,

int>m;

intmain()

}}cout<<

0

}

排序演算法總結

1 直接插入排序 1 穩定性 穩定 2 適用情況 待排記錄規模較小,或者記錄已經基本有序 2 希爾排序 1 穩定性 不穩定 2 特點 希爾排序的執行時間依賴於增量序列,它的效率比直接插入排序有較大的改進。3 氣泡排序 1 穩定性 穩定 2 特點 當待排記錄基本有序是,氣泡排序是不錯的選擇 但由於氣泡...

排序演算法總結

1 選擇排序 選擇排序的思想是依次從待排序數列中選擇最大 小 的 第二大 小 的等等,然後依次重新排列為有序數列。void selectionsort int a,int n if min i 時間複雜度o n 2 2 歸併排序 void merge int a,int left,int mid,i...

排序演算法總結

學習了這麼多的排序演算法,還沒有做個總結,呵呵 氣泡排序 氣泡排序是最慢的排序演算法。在實際運用中它是效率最低的演算法。它通過一趟又一趟地比較陣列中的每乙個元素,使較大的資料下沉,較小的資料上公升。它是 o n 2 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來...