由於程式比較簡單,所以沒有加什麼注釋。所有的程式都給出了完整的執行**,並在我的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...