資料的6種排序方法

2021-07-23 09:07:19 字數 3761 閱讀 6568

今天講了堆排序,就這以前學過的排序方法,我來做乙個總結

1、選擇排序:

選擇排序是比較基礎的排序方法,需要兩個迴圈,用於對每乙個數進行查詢和替換,不用多說,**如下:

#includeint a[101];

int main()

for(i=0;i

其實也沒什麼優點,關鍵是好想,對於初學者,是必須掌握的

2、氣泡排序:

跟選擇排序差不多,只是選擇排序先從前面確定數,而氣泡排序恰恰相反

**如下:

#includeint a[101];

int main()

for(i=0;i

這個就不必多說了吧

3、桶排序:

這個其實根本不叫排序,只是把乙個數裝入與它數值一樣的陣列小房間裡罷了,再乙個個輸出

**如下:

#includeint a[100001];

int main()

}while(i<=j);

if(l

快排雖快,但是極不穩定,真正穩定的排序方法,是下面的歸併排序

5、歸併排序

歸併排序是指將陣列劃分成乙個個小分段,乙個個小分段進行排序,最後在合併起來排序,有二分查詢的思想在裡面

**如下:

#includeint a[101];

void sort(int l,int r)

; int m,i,j,k;

if(l==r)//只剩乙個就無視了

return;

m=(l+r)/2;

sort(l,m);//二分查詢

sort(m+1,r);

i=l,j=m+1,k=l;

while(i<=m&&j<=r)

else

}while(i<=m)//剩下的一口氣塞進去

while(j<=r)

for(i=l;i<=r;i++)//有借有還

a[i]=s[i];

}int main()

歸併排序非常的穩定,且時間複雜度極低

下面來看乙個例題 (  ⊙ o ⊙  )

描述考慮1,2,…,n的排列i1,i2,…,in,如果其中存在j,k,滿足 j < k 且i

j> i

k,那麼就稱(ij,ik)是這個排列的乙個逆序。乙個排列含有逆序的個數稱為這個排列的逆序數。例如排列 263451 含有8個逆序(2,1),(6,3),(6,4),(6,5),(6,1),(3,1),(4,1),(5,1),因此該排列的逆序數就是8。顯然,由1,2,…,n 構成的所有n!個排列中,最小的逆序數是0,對應的排列就是1,2,…,n;最大的逆序數是n(n-1)/2,對應的排列就是n,(n-1),…,2,1。逆序數越大的排列與原始排列的差異度就越大。

現給定1,2,…,n

的乙個排列,求它的逆序數。

輸入第一行是乙個整數n,表示該排列有n個數(n <= 100000)。

第二行是n個不同的正整數,之間以空格隔開,表示該排列。

輸出輸出該排列的逆序數。

樣例輸入

62 6 3 4 5 1

樣例輸出8

這道題就可以用歸併排序,交換的時候加一下交換數就行了

**如下:

#include#include#include#includeusing namespace std;

int a[100001],b[100001],n;

long long g;

void msort(int l,int r)

else

}while(i<=m)

while(j<=r)

for(i=l;i<=r;i++)

a[i]=b[i];

return;

}int main()

幾乎就是複製貼上的啊

6、堆排序

其實就是使用二叉樹的特性來排序,通過交換來將最小數轉移到根節點,再刪除根節點,重新建樹

可使用algorithm的函式

**如下:

#include#include#includeusing namespace std;

int a[10005];

int k;

int main()

for(i=1;i<=n;i++)

}

跟快排一樣,比較的不穩定,但是很方便

下面再來看乙個例題 (  ⊙ o ⊙  )

合併果子

題目描述

在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。 多多決定把所有的果子合成一堆。每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n-1次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體力之和。因為還要花大力氣把這些果子搬回家,所以多多在合併果子時要盡可能地節省體力。 假定每個果子重量都為1,並且已知果子的種類數和每種果子的數目,你的任務是設計出合併的次序方案,使多多耗費的體力最少,並輸出這個最小的體力耗費值。例如有3種果子,數目依次為1,2,9。可以先將 1、2堆合併,新堆數目為3,耗費體力為3。接著,將新堆與原先的第三堆合併,又得到新的堆,數目為12,耗費體力為 12。所以多多總共耗費體力=3+12=15。可以證明15為最小的體力耗費值。

輸入第1行:乙個整數n(1≤n≤10000),表示果子的種類數。第2行:包含n個整數,用空格分隔,第i個整數ai(1≤ai≤20000)是第i種果子的數目。

輸出一行只包含乙個整數,也就是最小的體力耗費值。輸入資料保證這個值小於2^31。

樣例輸入

31 2 9

樣例輸出15

這道題就可以使用堆排序啦 ~\ ( ≧ ▽ ≦ ) /~

使用的總力氣用乙個變數,一直加加就好啦

**如下:

#include#include#includeusing namespace std;

int a[10005];

int k;

int main()

int x;

for(i=1;i());

x+=a[1];

pop_heap(a+1,a+n-i+1,greater());

k+=x;

a[n-i]=x;

push_heap(a+1,a+n-i+1,greater());

} printf("%d",k);

}

除了這種方法外,還可以使用優先佇列

priority_queue,greater>h;//注意:int> >h 之間必須有乙個空格

**如下:

#include#include#includeusing namespace std;

priority_queue,greater>h;

int main()

{ //freopen("fruit2.in","r",stdin);

//freopen("fruit2.out","w",stdout);

int n,k,i;

scanf("%d",&n);

for(i=0;i

黑科技啊 ╮(╯▽╰)╭,這玩意可以把推進去的數自動排序,媽媽再也不用擔心我的排序了 o(∩_∩)o哈哈~

好了,這就是我總結的排序方法啦,喜歡或者對你有所幫助的話,別忘了頂一下喲,蟹蟹 ~\(≧▽≦)/~

6種排序模板

看幾個動畫演示 穩定的排序有 冒泡 插入 歸併 一 氣泡排序 o n n 氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會...

6種排序演算法

氣泡排序 選擇排序 歸併排序 快速排序 堆排序插入排序,顧名思義肯定是已插入為主,將待排序的陣列分為已排序 陣列前部分 和未排序 陣列後部分 這裡我們已從小到大排序,陣列為num 0 end 剛開始排序時,固定第乙個數num 0 為已經排序好的數,從第二個數num 1 開始,從後往前比較已排序中的資...

pandas提取資料的6種方法

pandas是python資料分析必備工具,它有強大的資料清洗能力,往往能用非常少的 實現較複雜的資料處理。import pandas as pd data pd.read excel 超市運營資料模板.xlsx 第一種方法,用比較運算子 data data.性別 男 第二種方法,用比較函式 eq ...