各種排序演算法

2021-10-06 22:48:50 字數 3250 閱讀 2898

(1)氣泡排序

演算法複雜度o(n^2)

void

bubblesort

(vector<

int>

& vec)

}return

;}

冒泡演算法的優化:

防止資料在已經有序的前提下還進行不必要的比較

void

bubblesort2

(vector<

int>

& vec)}}

return

;}

(2) 選擇排序

演算法複雜度o(n^2)

每次固定第i個位置,從i之後的資料找出應該放在這裡的資料

void

selectsort

(vector<

int>

& vec)

if(i != min)

swap

(i,min);}

}

(3)插入排序

類似於玩撲克牌:將乙個記錄插入到已經排好序的有序表中,從而得到乙個新的,記錄數增加1的記錄

void

insertsort

(vector<

int>

& vec)

vec[j+1]

= k;}}

}

(4) 希爾排序

對插入排序的改進

基本有序:小的資料基本在前面,打的資料基本在後邊,不大不小的基本在中間

將相距某個增量的記錄組成乙個子串行,這樣才能保證在子串行內分別進行直接插入排序後得到的結果是基本有序,而不是區域性有序

時間複雜度:o(nlogn)~o(n^2)

void

shellsort

(vector<

int>

& vec)

vec[j+increment]

= vec[0]

;}}}

while

(increment >1)

;}

(4)堆排序

對簡單選擇排序的改進

堆是具有下列性質的完全二叉樹:每個結點的值都大於或等於其左右孩子節點的值,稱為大頂堆,或者每個節點的值都小於或等於其左右孩子結點的值,稱為小頂堆

堆排序思想:將待排序的序列構造成乙個大頂堆。此時,整個序列的最大值就是堆頂根節點。將它移走(其實就是將其與堆陣列的末尾元素交換,此時末尾元素就是,最大值),然後將剩餘的n-1個序列重新構造成乙個堆,這樣就得到n個元素中的次大值,如此反覆.演算法時間複雜度o(nlogn)

這裡仍然假設陣列的長度為n+1

**:

void

heapsort

(vector<

int>

&vec)

for(i = vec.

size()

-1;i>1;

--i)

}void

heapsort

(vector<

int>

&vec,

int s,

int m)

vec[s]

= temp;

}

(5)歸併排序

歸併排序使用了分治的思想,將陣列二分成乙個乙個的單元,逐個單元進行兩兩歸併排序,最後合併成乙個有序的序列

時間複雜度o(nlogn)

**:

void

mergesort

(vector<

int>

&vec,vector<

int>

&vec2)

void

msort

(vector<

int>

&vec,vector<

int>

&vec2,

int s,

int t)

}void

merge

(vector<

int>

& vec,vector<

int>

& vec2,

int i,

int m,

int n)

if(i<=m)

if(j<=n)

}

歸併排序的非遞迴實現:

vector<

int>

merge

(vector<

int>

& data,

int begin,

int mid,

int end)

for(

int i=

0;i++i)

int i=

0,j=

0,k = begin;

while

(iwhile

(idata[k++

]= left[i++];

while

(j < n2)

data[k++

]= right[j++];

return data;

}vector<

int>

mergesort

(vector<

int> data)

i*=2

;}return res;

}

非遞迴的思想就是從2開始,以2的倍數增長進行兩兩歸併操作,最後使整個陣列有序

(6)快速排序

注意當基準數選擇最左邊的數字時,那麼就應該先從右邊開始搜尋,當基準數選擇最右邊的數字時,就應該從左邊開始搜尋,不論從小到大排序還是從大到小排序;

**:

void

quicksort

(vector<

int>

&vec,

int left,

int right)

} vec[left]

= vec[i]

; vec[i]

= base;

quicksort

(vec,left,i-1)

;quicksort

(vec,i+

1,right)

;}

快速排序的優化方法:

1.基準值的選擇:隨機選擇基準值、陣列的開頭、結尾、中間的三數取中間的那部分

2.當待排序的部分分割到一定長度後,採用插入排序法

3.每次排序後將與基準值相等的元素聚集起來

排序 各種排序演算法

每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子表中適當位置,直到全部記錄插入完成為止 待排序的記錄放在陣列r 0,n 1 中 排序過程中將r分成兩個子區間,有序區r 0,i 1 無序區r i,n 1 將當前無序區的第1個記錄,插入到有序區中適當的位置上 每次是有序區增加乙個記錄,知道...

各種排序演算法

交換函式 void swap int a,int b 氣泡排序 氣泡排序 bubble sort,台灣譯為 泡沫排序或氣泡排序 是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排...

各種排序演算法

include include include using namespace std void swap int a,int b void output int a,int n 直接插入排序 時間複雜度o n 2 void insertsort int a,int n 折半插入排序 o n 2 只...