C 常用排序法研究

2021-05-07 15:43:35 字數 3633 閱讀 8293

檢視( 877 ) /

評分( 0 / 0 )

首先介紹乙個計算時間差的函式,它在頭檔案中定義,於是我們只需這樣定義2個變數,再相減就可以計算時間差了。

函式開頭加上   

clock_t   start   =   clock();   

函式結尾加上   

clock_t   end   =   clock();   

於是時間差為: end - start

不過這不精確的   多次執行時間是不同的   和cpu   程序有關吧

(先總結一下:以下演算法以時間和空間以及編碼難度,以及實用性方面來看,快速排序法是最優秀的!推薦!~

但是希爾排序又是最經典的乙個,所以建議優先看這2個排序演算法)

排序演算法是一種基本並且常用的演算法。由於實際工作中處理的數量巨大,所以排序演算法 

對演算法本身的速度要求很高。 

而一般我們所謂的演算法的效能主要是指演算法的複雜度,一般用o方法來表示。在後面我將 

給出詳細的說明。 

對於排序的演算法我想先做一點簡單的介紹,也是給這篇文章理乙個提綱。 

我將按照演算法的複雜度,從簡單到難來分析演算法。 

第一部分是簡單排序演算法,後面你將看到他們的共同點是演算法複雜度為o(n*n)(因為沒有 

使用word,所以無法打出上標和下標)。 

第二部分是高階排序演算法,複雜度為o(log2(n))。這裡我們只介紹一種演算法。另外還有幾種 

演算法因為涉及樹與堆的概念,所以這裡不於討論。 

第三部分類似動腦筋。這裡的兩種演算法並不是最好的(甚至有最慢的),但是演算法本身比較 

奇特,值得參考(程式設計的角度)。同時也可以讓我們從另外的角度來認識這個問題。 

第四部分是我送給大家的乙個餐後的甜點——乙個基於模板的通用快速排序。由於是模板函式 

可以對任何資料型別排序(抱歉,裡面使用了一些論壇專家的呢稱)。 

現在,讓我們開始吧: 

一、簡單排序演算法 

由於程式比較簡單,所以沒有加什麼注釋。所有的程式都給出了完整的執行**,並在我的vc環境 

下執行通過。因為沒有涉及mfc和windows的內容,所以在borland c++的平台上應該也不會有什麼 

問題的。在**的後面給出了執行過程示意,希望對理解有幫助。 

1.冒泡法: 

這是最原始,也是眾所周知的最慢的演算法了。他的名字的由來因為它的工作看來象是冒泡: 

#include 

void bubblesort(int* pdata,int count) 

[page]

}while(i<=j);//如果兩邊掃瞄的下標交錯,就停止(完成一次) 

//當左邊部分有值(lefti),遞迴右半邊 

if(right>i) 

run(pdata,i,right); 

} void quicksort(int* pdata,int count) 

void main() 

; quicksort(data,7); 

for (int i=0;i<7;i++) 

cout《如果你擔心這個問題,你可以使用堆排序,這是一種穩定的o(log2(n)*n)演算法,但是通常情況下速度要慢 

於快速排序(因為要重組堆)。 

三、其他排序 

1.雙向冒泡: 

通常的冒泡是單向的,而這裡是雙向的,也就是說還要進行反向的工作。 

**看起來複雜,仔細理一下就明白了,是乙個來回**的方式。 

寫這段**的作者認為這樣可以在冒泡的基礎上減少一些交換(我不這麼認為,也許我錯了)。 

反正我認為這是一段有趣的**,值得一看。 

#include 

void bubble2sort(int* pdata,int count) 

演算法分析 

1.增量序列的選擇 

shell排序的執行時間依賴於增量序列。 

好的增量序列的共同特徵: 

① 最後乙個增量必須為1; 

② 應該盡量避免序列中的值(尤其是相鄰的值)互為倍數的情況。 

有人通過大量的實驗,給出了目前較好的結果:當n較大時,比較和移動的次數約在nl.25到1.6n1.25之間。 

2.shell排序的時間效能優於直接插入排序 

希爾排序的時間效能優於直接插入排序的原因: 

①當檔案初態基本有序時直接插入排序所需的比較和移動次數均較少。 

②當n值較小時,n和n2的差別也較小,即直接插入排序的最好時間複雜度o(n)和最壞時間複雜度0(n2)差別不大。 

③在希爾排序開始時增量較大,分組較多,每組的記錄數目少,故各組內直接插入較快,後來增量di逐漸縮小,分組數逐漸減少,而各組的記錄數目逐漸增多,但由於已經按di-1作為距離排過序,使檔案較接近於有序狀態,所以新的一趟排序過程也較快。 

因此,希爾排序在效率上較直接插人排序有較大的改進。 

3.穩定性 

希爾排序是不穩定的。

四、基於模板的通用排序: 

這個程式我想就沒有分析的必要了,大家看一下就可以了。不明白可以在論壇上問。 

mydata.h檔案 

/// 

class cmydata  

; const char* getdata(); 

//這裡過載了操作符: 

cmydata& operator =(cmydata &srcdata); 

bool operator <(cmydata& data ); 

bool operator >(cmydata& data ); 

private: 

char* m_strdatamember; 

int m_idatasize; 

}; mydata.cpp檔案 

cmydata::cmydata(): 

m_iindex(0), 

m_idatasize(0), 

m_strdatamember(null) 

cmydata::~cmydata() 

cmydata::cmydata(int index,char* strdata): 

m_iindex(index), 

m_idatasize(0), 

m_strdatamember(null) 

cmydata& cmydata::operator =(cmydata &srcdata) 

bool cmydata::operator <(cmydata& data ) 

/// 

// //主程式部分 

#include 

#include /"mydata.h/" 

template 

void run(t* pdata,int left,int right) 

}while(i<=j);//如果兩邊掃瞄的下標交錯,就停止(完成一次) 

//當左邊部分有值(lefti),遞迴右半邊 

if(right>i) 

run(pdata,i,right); 

} template 

void quicksort(t* pdata,int count) 

void main() 

; quicksort(data,8); 

for (int i=0;i<8;i++) 

cout

C 氣泡排序法 插入排序法 選擇排序法

是陣列等線性排列的數字從大到小或從小到大排序。以從小到大排序為例。資料 11,35,39,30,7,36,22,13,1,38,26,18,12,5,45,32,6,21,42,23 使用 陣列 int array 儲存數字。過程 陣列從小到大排序 思路迴圈都把最大的數放在最後一位,無序數字個數減1...

最常用的排序 快速排序法

桶排序浪費空間,氣泡排序雖然解決了空間問題卻在演算法的執行效率上犧牲了很多,因此我們的快速排序法就誕生了,是不是聽這個名字就很高檔呢?假設現在需要對 6,1,2,7,9,3,4,5,10,8 這十個數排序.我們需要先定義乙個基準數,其實也就是乙個作為參照的數,為了方便一般就把第乙個數作為基準數,也就...

C 氣泡排序法

using system using system.collections.generic using system.text 該方法獲得需要排序的陣列,表呼叫排序方法進行排序 public static void sortednumbers 個數字 numbercount for int i 0 ...