今天講了堆排序,就這以前學過的排序方法,我來做乙個總結
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 ...