檢視( 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 是陣列等線性排列的數字從大到小或從小到大排序。以從小到大排序為例。資料 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 這十個數排序.我們需要先定義乙個基準數,其實也就是乙個作為參照的數,為了方便一般就把第乙個數作為基準數,也就... using system using system.collections.generic using system.text 該方法獲得需要排序的陣列,表呼叫排序方法進行排序 public static void sortednumbers 個數字 numbercount for int i 0 ...C 氣泡排序法 插入排序法 選擇排序法
最常用的排序 快速排序法
C 氣泡排序法