簡單排序演算法

2021-07-14 23:43:46 字數 2541 閱讀 7408

由於程式比較簡單,所以沒有加什麼注釋。所有的程式都給出了完整的執行**,並在我的vc環境

下執行通過。因為沒有涉及mfc和windows的內容,所以在borland c++的平台上應該也不會有什麼

問題的。在**的後面給出了執行過程示意,希望對理解有幫助。

1.冒泡法:

這是最原始,也是眾所周知的最慢的演算法了。他的名字的由來因為它的工作看來象是冒泡:

#include 

void bubblesort(int* pdata,int count)}}

}void main()

; bubblesort(data,7);

for (int i=0;i<7;i++)

cout

<" ";

cout

<<"\n";

}

倒序(最糟情況)

第一輪:10,9,8,7->10,9,7,8->10,7,9,8->7,10,9,8(交換3次)

第二輪:7,10,9,8->7,10,8,9->7,8,10,9(交換2次)

第一輪:7,8,10,9->7,8,9,10(交換1次)

迴圈次數:6次

交換次數:6次

其他:

第一輪:8,10,7,9->8,10,7,9->8,7,10,9->7,8,10,9(交換2次)

第二輪:7,8,10,9->7,8,10,9->7,8,10,9(交換0次)

第一輪:7,8,10,9->7,8,9,10(交換1次)

迴圈次數:6次

交換次數:3次

上面我們給出了程式段,現在我們分析它:這裡,影響我們演算法效能的主要部分是迴圈和交換,

顯然,次數越多,效能就越差。從上面的程式我們可以看出迴圈的次數是固定的,為1+2+…+n-1。

寫成公式就是1/2*(n-1)*n。

現在注意,我們給出o方法的定義:

若存在一常量k和起點n0,使當n>=n0時,有f(n)<=k*g(n),則f(n) = o(g(n))。(呵呵,不要說沒
學好數學呀,對於程式設計數學是非常重要的!!!)

現在我們來看1/2*(n-1)n,當k=1/2,n0=1,g(n)=n*n時,1/2(n-1)*n<=1/2*n*n=k*g(n)。所以f(n)

=o(g(n))=o(n*n)。所以我們程式迴圈的複雜度為o(n*n)。

再看交換。從程式後面所跟的表可以看到,兩種情況的迴圈相同,交換不同。其實交換本身同資料來源的

有序程度有極大的關係,當資料處於倒序的情況時,交換次數同迴圈一樣(每次迴圈判斷都會交換),

複雜度為o(n*n)。當資料為正序,將不會有交換。複雜度為o(0)。亂序時處於中間狀態。正是由於這樣的

原因,我們通常都是通過迴圈次數來對比演算法。

3.選擇法:

現在我們終於可以看到一點希望:選擇法,這種方法提高了一點效能(某些情況下)

這種方法類似我們人為的排序習慣:從資料中選擇最小的同第乙個值交換,在從省下的部分中

選擇最小的與第二個交換,這樣往復下去。

#include 

void selectsort(int* pdata,int count)

; selectsort(data,7);

for (int i=0;i<7;i++)

cout

<" ";

cout

<<"\n";

}

倒序(最糟情況)

第一輪:10,9,8,7->(itemp=9)10,9,8,7->(itemp=8)10,9,8,7->(itemp=7)7,9,8,10(交換1次)

第二輪:7,9,8,10->7,9,8,10(itemp=8)->(itemp=8)7,8,9,10(交換1次)

第一輪:7,8,9,10->(itemp=9)7,8,9,10(交換0次)

迴圈次數:6次

交換次數:2次

其他:

第一輪:8,10,7,9->(itemp=8)8,10,7,9->(itemp=7)8,10,7,9->(itemp=7)7,10,8,9(交換1次)

第二輪:7,10,8,9->(itemp=8)7,10,8,9->(itemp=8)7,8,10,9(交換1次)

第一輪:7,8,10,9->(itemp=9)7,8,9,10(交換1次)

迴圈次數:6次

交換次數:3次

遺憾的是演算法需要的迴圈次數依然是1/2*(n-1)*n。所以演算法複雜度為o(n*n)。

我們來看他的交換。由於每次外層迴圈只產生一次交換(只有乙個最小值)。所以f(n)<=n

所以我們有f(n)=o(n)。所以,在資料較亂的時候,可以減少一定的交換次數。

氣泡排序和選擇排序是排序演算法中比較簡單和容易實現的演算法。氣泡排序的思想為:每一次排序過程,通過相鄰元素的交換,將當前沒有排好序中的最大(小)移到陣列的最右(左)端。而選擇排序的思想也很直觀:每一次排序過程,我們獲取當前沒有排好序中的最大(小)的元素和陣列最右(左)端的元素交換,迴圈這個過程即可實現對整個陣列排序。

簡單排序演算法

package com.shine.sort 排序演算法 說明 排序演算法分為三種 插入排序 交換排序 選擇排序 1.插入排序 直接插入排序 折半插入排序 希爾排序 2.交換排序 氣泡排序 快速排序 3.選擇排序 直接選擇排序 堆排序 public class mysort 希爾排序 描述 1.將乙...

簡單排序演算法

演算法思想 將初始序列 a 0 a n 1 作為待排序序列,第一趟在待排序序列 a 0 a n 1 中找最小值元素,與該序列中第乙個元素a 0 交換,這樣的子串行 a 0 有序,下一趟排序在待排序子串行 a 1 a n 1 中進行。第i趟排序在待排序子串行 a i 1 a n 1 中,找最小值元素,...

簡單排序演算法

第乙個 氣泡排序 簡單來說,就是不停的與旁邊的比較,然後交換,總之運算的交換次數挺多的,後面再來比較幾種排序方法 void bubblesorthead int pdata,int count 這是一種實現形式,還有另一種 void bubblesorttail int pdata,int coun...