演算法 排序一

2021-08-17 01:54:06 字數 3142 閱讀 5539

排序在商業資料處理和現代科學計算中的重要性不言而喻。它能夠應用於日常事物處理、組合優化、天體物理學、分子動力學、語言學、基因組學、天氣預報和其他相關領域。 20世紀科學與工程領域的十大演算法之一就是一種排序演算法——快速排序。

在標準庫中已經實現排序函式,再學習排序演算法仍有重要實際意義。再重溫排序演算法之前,我並沒有意識到。

對排序演算法的分析將有助於全面理解比較演算法效能的方法。

類似的演算法思想也能有效解決其他型別問題。

排序演算法常常是解決其他問題的第一步。

#include 

using

namespace

std;

template

class sortmethod

~sortmethod(){}

static

bool issortd(t a ,int n)

static

void print(t a, int n)

cout

void select_sort(t a, int n); // 選擇排序

static

void bubble_sort(t a, int n); // 氣泡排序

static

void insert_sort(t a, int n); // 插入排序

private:

static

bool less(t a, t b)

static

void exch(t a, int i, int j)

};// 選擇排序

template

void sortmethod::select_sort(t a, int n)

}

呼叫方法:
char ch[12] = ;

sortmethod::print(ch,11);

sortmethod::select_sort(ch,11);

bool sorted = sortmethod::issortd(ch,11);

sortmethod::print(ch,11);

cout

<<"sorted: "

sortmethod::print(a,10);

sortmethod::select_sort(a,10);

sorted = sortmethod::issortd(a,10);

sortmethod::print(a,10);

cout

<<"sorted: "

<結論: 對於長度為n的陣列,選擇排序大約需要n2/2n

2/

2次比較和

n n

次交換。

// 氣泡排序

template

void sortmethod::bubble_sort(t a, int n)

}}

結論: 對於長度為n的陣列,氣泡排序大約需要n2

/2' role="presentation">n2/

2n2/

2次比較,最壞情況下,同樣需要n2/2n

2/

2次交換。

// 插入排序

templatet> void sortmethod::insert_sort(t a, int n)

}}

結論: 對於隨機排列的長度為n的不重複陣列,平均情況下插入排序需要~n2/4n

2/

4次比較以及~n2/4n

2/

4次的交換。最壞情況下與冒泡法相同。

// 希爾排序

templatet> void sortmethod::shell_sort(t a, int n)

h = h/3;

}}

在這裡,1,4,13,40,121,364,1093,…. 稱為遞增數列。

為什麼這裡選擇這樣的遞增數列?如何選擇更好的遞增序列? 回答這個問題並不簡單。 有很多**研究了各種不同的遞增序列,但都無法證明某個序列是「最好的」。其不僅取決於h的值,還取決於h之間的數學性質,如公因子等。一般情況下也選擇遞增數列如 n/2 n/4 n/8 … 1 ( 逆序排列 )。 在實際應用中,這兩種遞增數列基本夠用。

希爾排序的重要意義是突破了排序演算法複雜度為o(

n2) o(n

2)

的限制,邁出了尋找更高效排序演算法的重要一步。

結論: 使用遞增數列1,4,13,40,121,364… ( h = 3*h + 1) 的希爾排序所需要的比較次數不會超過n的若干倍乘以遞增序列的長度(即while 迴圈次數)。

這裡給出比較兩種演算法效能的具體實現,科學方法就是要通過實踐來檢驗真理。理論上的演算法效率是否在實際使用中得到確認?

// 比較方法類

class sortcompare

total += time(sorttype,a,n);

}delete a;

return total;

}private:

static

double time(string sorttype, int a, int n)

};// 呼叫

int n = 10000;

int t = 100;

string type1 = "shell";

string type2 = "insert";

double t1 = sortcompare::timerandomdata(type1,n,t);

double t2 = sortcompare::timerandomdata(type2,n,t);

cout

<<"for "

<< n << " random ints "

<" cost :"

<" s and "

<" costs :"

<" s."

《執行結果:

for 10000 random ints

shell cost :826 ms and insert costs :112280 ms.

請按任意鍵繼續…

大膽使用大陣列測試希爾排序。

排序演算法(一)

這個學期課程很少,空閒時間很多,故重新複習了一下 演算法導論 中的常用演算法和資料結構,並且將實現 儲存到部落格,以便大三暑假找實習時方便複習。直接插入排序的思想非常簡單,將序列中第乙個元素作為乙個有序序列,然後將剩下的n 1個元素按關鍵字大小依此插入該有序序列,每插入乙個元素後依然保持該序列有序,...

排序演算法一

3個簡單的排序演算法,不多解釋了,直接上 include include void display int a,int n printf n void exchange int a,int i,int j 氣泡排序 void popsort int a,int n end for j printf ...

排序演算法(一)

氣泡排序 基本思想 在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉 較小的往上冒。即 每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。氣泡排序的示例 演算法實現 void print int arr,int size...