cpp排序演算法總結

2021-09-18 06:25:03 字數 2506 閱讀 7596

注意:

- 快排是不穩定排序

思路:選基數,雙指標移動/交換,分治

示例:> 坐在馬桶上看演算法:快速排序 - 51cto.com

> 快速排序(三種演算法實現和非遞迴實現) - csdn部落格

第一輪

i j

6 1 2 7 9 3 4 5 10 8

基數 x=6

先從 j 往前遍歷(j--),遇到小於 x 的數停下,再從 i 往後遍歷,遇到大於 x 的數停下,交換 *j 和 *i

i j

6 1 2 7 9 3 4 5 10 8

6 1 2 5 9 3 4 7 10 8(交換後)

重複以上步驟,繼續先移動 j,再移動 i

i j

6 1 2 5 9 3 4 7 10 8

6 1 2 5 4 3 9 7 10 8(交換後)

ij6 1 2 5 4 3 9 7 10 8

6 1 2 5 4 3 9 7 10 8(交換後)

此時 i 與 j 相遇,交換 *i 與 *x

ij3 1 2 5 4 6 9 7 10 8

第一輪完成,之後遞迴完成子部分

基數的選擇不固定,一般選擇第乙個或最後乙個,或中位數

void

quicksort

(vector<

int>

&array,

int low,

int high)

//最後一次把pivot放到合適位置現在的單個元素也要放到pivot的地方去

swap

(array[pivot]

, array[i]);

int mid = i;

//寫在乙個函式裡需要新的變數來遍歷不然low和high已經移動

quicksort

(array, low, mid -1)

;quicksort

(array, mid +

1, high)

;return

;}

void

mergesort

(vector<

int>

&array,

int low,

int high)

void

merge

(vector<

int>

&array,

int low,

int mid,

int high)

while

(cur1 <= mid)

temp[t++

]= array[cur1++];

while

(cur2 <= high)

temp[t++

]= array[cur2++];

for(t = low; t <= high; t++

)}

listnode *

findhalf

(listnode *head)

return low;

}listnode *

mergesort

(listnode *head)

listnode*

merge

(listnode *pa,listnode *pb)

else

rear = rear-

>next;}if

(pa)

rear-

>next = pa;

if(pb)

rear-

>next = pb;

return dummy.next;

}

void

insertsort

(vector<

int>

&array)

array[j+1]

= temp;}}

}void

shellsort

(vector<

int>

&array)}}

}

void

bubblesort

(vector<

int>

&array)

if(flag ==

false

)return;}

}

void

selectsort

(vector<

int>

&array)

}

cpp氣泡排序

氣泡排序演算法分析,這裡資料給的簡單點 3 2 1.要把這三個數字按從小到大 這個一般為正序 排列,也就是排出1 2 3的結果.具體看 大於就是正序,小於則相反 冒泡的做法 這裡是前乙個數字比後乙個大的話 就交換位置 第一趟 1.3 2 交換位置 此時 2 3 1 2.3 1 交換位置 此時 2 1...

CPP複習總結

1.cstringstrstr strlwr strupr 2.呼叫複製建構函式的幾種情況 乙個新物件被另乙個已經存在的同型別物件用以初始化 當乙個物件作為實參傳遞給函式形參時要呼叫複製建構函式,函式返回時自動呼叫其析構函式 在函式返回乙個物件時呼叫複製建構函式。3.靜態資料成員初始化 資料型別 類...

堆排序,cpp實現

include using namespace std void swap int a,int b 初始建堆,實為對孩子所在列的插入排序 void buildheap int a,int length 在每次刪除頂部元素後恢復堆,本質上從頂部開始,和左右孩子較大的孩子交換,一直到不能交換為止,時間效...