內容:1、簡單的選擇排序;
2、使用模板(泛型)使演算法更加靈活;
3、使用結構體完成學生的name和score屬性的排序;
4、隨機生成演算法測試用例。
寫在前面:為什麼學習o(n^2)的排序演算法?
基礎
1、selection sort 選擇排序
基本思路
如:8 6 2 3 1 5 7 4
對乙個序列a中的元素a[1]~a[n],令i從1到n的列舉,進行n趟操作,每趟從排序部分[i,n]中選擇最小的元素,令其與待排序部分的第乙個元素a[i]進行交換,直到排序完成。
示例:[1,8]中1最小(1,8交換)——>1 6 2 3 8 5 7 4
[2,8]中2最小(2,6交換)——>1 2 6 3 8 5 7 4
[3,8]中3最小(3,6交換)——>1 2 3 6 8 5 7 4
[4,8]中4最小(4,6交換)——>1 2 3 48 5 7 6
[5,8]中5最小(5,8交換)——>1 2 3 4 5 8 7 6
[6,8]中6最小(6,8交換)——>1 2 3 4 5 6 7 8
[7,8]中7最小(7,8不換)——>1 2 3 4 5 6 7 8
排序完成
**塊1:
void selectionsort(int a,int n)
; selectionsort(a,10);
for(int i=0;i<10;i++)
cout執行結果:
以上,我使用int、float和string三種型別完成對應型別的排序工作,但我只呼叫了一種函式。這就是模板(泛型)帶來的好處,可以引用不同型別的資料型別,使自己的演算法更加靈活多變。
3、使用標頭檔案定義student結構體,實現學生分數排序。(重要)
student.h
#pragma once
#ifndef selectionsort_student_h
#define selectionsort_student_h
#include#includeusing namespace std;
struct student
friend ostream& operator<
selectionsort(d, 4);
for (int i = 0; i<4; i++)
cout << d[i];
cout << endl;
執行結果:
思考:學生d和學生b成績一樣,是按照什麼順序排列的呢?怎麼排列使它更加合理化呢?
學生d和學生b是按照原先陣列給定的順序排列的;如果使排序更加合理化,我們可以將學生的姓名進行一次排序,類似於我們平時的 姓名首字母排序。
如何實現name屬性排序呢?
我們在使用方法判斷score大小時,可以利用條件運算子(三目運算子)實現name大小比較。即:
return score != otherstudent.score ? score < otherstudent.score : name < otherstudent.name;
是否相等——>不相等比較成績
——>相等則比較姓名
**塊5:
return score != otherstudent.score ? score < otherstudent.score : name < otherstudent.name;
執行結果:
學生b的字母是排在學生d的字母前面的。
由此可見,自定義比較的威力是非常強大的,要學會自己定義,深入思考演算法精髓,使自己的程式設計更加個性化,而不是僅僅侷限於現成的**和演算法,甘心做個**印表機。
內功修煉之O n 的排序演算法(一)
本文參考程式設計師內功修煉課程,所有實現 均能在github上找到。一 選擇排序 selection sort 1 基本思想 給定陣列int arr 第 1趟排序,在待排序資料arr 1 arr n 中選出最小的 資料,將它與arr 1 交換 第 2趟,在待排序 資料arr 2 arr n 中選出最...
修煉演算法內功 插入排序(一)
1 最切合實際的例子 在我們生活中,常見的撲克牌就是乙個很好的例子。正常人抓牌通常都是如下的幾個步驟 抓取第一張排放在手中 抓取第二張牌與第一張做比較,如果比第一張大則放在左邊,反之,右邊。放在哪邊是個人習慣務必較真 抓取第三張先與第一張比較,大左小右 再與第二張比較,大左小右。重複抓取並迴圈比較,...
修煉演算法內功 歸併排序(一)
內容 歸併排序演算法思想 歸併排序演算法的實現 歸併排序演算法的優化 1 歸併排序演算法思想 對於給定的一串陣列如 5 3 7 2 6 4 8 1 我們可以進行如下幾個步驟 將陣列從中間分成兩組陣列 5 3 7 2和6 4 8 1分別排序 同樣,我們可以繼續拆分這兩個陣列為5 3和7 2以及6 4和...