修煉演算法內功 選擇排序(一)

2021-08-21 15:48:58 字數 2201 閱讀 7696

內容: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和...