雖然標題中的排序演算法往往被認為是低效率的演算法.但並不意味著這些演算法完全沒有可取之處。本次不再**這些演算法的基本原理,僅僅比較演算法的效能,並貼出實現這些演算法的源**:
還是先肝**吧(手動狗頭):
# include"iostream
"# include
"vector
"# include
"ctime
"# include
"cstdlib
"using
namespace
std;
void insert_sort(vector &);
void choosesort(vector &);
void bubblesort(vector &);
void combsort(vector &);
intmain()
//}//採用隨機數生成法。
srand((unsigned)time(null));//
根據時鐘生成不同的種子,保證每次執行程式產生不同的隨機數
for (int i = 1; i <= max_number; i++)
//cout << "the initial order: "; 資料量太大,不適合輸出
//vector::iterator ia = a.begin();
//for (; ia != a.end(); ia++)
//
//cout << endl;
vectorb(a);
vector
c(a);
vector
d(a);
//show the initial order of the vector
//cout << "the initial order before sorting : ";
//vector::iterator ia = a.begin();
//for (; ia != a.end(); ia++)
//
//cout << endl;
//插入排序測試
clock_t start, finish;
double
runtime;
start =clock();
insert_sort(a);
finish =clock();
runtime = (double)(finish - start) /clocks_per_sec;
cout
<< "
the time of insert sort algorithm is:
"<< runtime << "s"
/選擇排序測試
start =clock();
choosesort(b);
finish =clock();
runtime = (double)(finish - start) /clocks_per_sec;
cout
<< "
the time of choose sort algorithm is:
"<< runtime << "s"
/氣泡排序測試
start =clock();
bubblesort(c);
finish =clock();
runtime = (double)(finish - start) /clocks_per_sec;
cout
<< "
the time of bubble sort algorithm is:
"<< runtime << "s"
/梳排序測試
start =clock();
combsort(d);
finish =clock();
runtime = (double)(finish - start) /clocks_per_sec;
cout
<< "
the time of comb sort algorithm is:
"<< runtime << "s"
/cout << "the new order after comb sorting : ";
//vector::iterator id = d.begin();
//for (; id != d.end(); id++)
//
//cout << endl;
system(
"pause");
return0;
}//插入排序
void insert_sort( vector & sort_a) ///
注意,採用vector
是可以作為引數進行傳遞的,那麼是否可以作為返回型別使用呢?
sort_a[j] =temp;
}//return sort_a;
//說明可以將vector本身作為函式的返回值使用,但是需要清楚的是:返回的時候,記憶體實際上發生了區域性變數複製,所以是否考慮返回引用???}//
選擇排序
void choosesort(vector &sort_a)
}//sort_a[i] = minnum;
//用於交換,但是本身自帶的函式可以實現
//sort_a[loc] = temp;
if (i !=loc)
}}//
氣泡排序
void bubblesort(vector &sort_a)
}}//
梳排序void combsort(vector &sort_a)}}
}
補充:由於之前對梳排序未做任何的說明,在此簡要的說明一下梳排序:梳排序的本質仍然是氣泡排序,差異在於,梳排序的冒泡物件並不是相鄰元素,而是距離為step的元素,而step是乙個變數(右大變小),即「梳子」間隙逐漸變小。而梳排序迭代的終止條件是:當step變成1,即退化為傳統的冒泡後,執行一次,則得到正確的順序。
在此,我們給出上述四種排序的測試結果:
不同排序演算法效能比較
5000
10000
15000
20000
插入0.839s
3.427
7.716s
13.648s
選擇0.667s
2.276
5.321s
9.208s
冒泡2.320s
9.177
20.823s
36.542s
梳0.016s
0.042
0.057s
0.079s
上述**中的(5000,10000,....表示資料規模,程式中隨機生成的隨機數,我們可以看到,測試結果表明:按照速度而言,演算法的時間效能上:梳》選擇》插入》冒泡(>表示優於);(冒泡辣雞實錘(開個玩笑)),即演算法效能上,梳排序的效能要遠遠高於其他的方式。我們通過觀察演算法執行時間,梳狀排序時間複雜度並不是o(n2),似乎比這個時間複雜度要低,實際上也的確如此。而對於插入,選擇,冒泡而言,儘管時間複雜度都是o(n2),但是畢竟還是有所差異,當資料更莫更大的時候,這種差異將會更加明顯,但是無疑,氣泡排序時間複雜度真的高,氣泡排序的最好,最差,平均時間複雜度都是相同的,都是o(n2)。
疑問:在學習梳排序的時候,見有描述稱其為不穩定的演算法,不知為何不穩定,望高手能予指點,謝謝!!
冒泡 插入 選擇排序效能分析
外層迴圈記錄 冒泡 到後面的數字個數,內層迴圈負責 選出 本次冒泡中最大的數 從小到大排序 相鄰比較,逆序交換。public static void bubble int a public static void swap int a,int a,int b 外層迴圈記錄當前要排序外接的索引,內層迴...
冒泡,插入,選擇排序
經典的排序演算法,此文章介紹三個 氣泡排序 它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。public void bubblesort int a while iswrap for int ...
冒泡 插入 選擇 快速排序
各位親 有時間可以去看看我的 金駿家居 店 買時說明在我的部落格看到有優惠哦 還有意外禮品贈送 真正的程式設計師 店 氣泡排序 每次找出最大或者最小的數放到序列的最後。插入排序 每一次查詢都把數放到已排序序列合適的位置。例子 4,3,2,1如數中的第乙個數肯定是有序的,從第二個數開始3小於4,放在已...