注意:
- 快排是不穩定排序
思路:選基數,雙指標移動/交換,分治
示例:> 坐在馬桶上看演算法:快速排序 - 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 在每次刪除頂部元素後恢復堆,本質上從頂部開始,和左右孩子較大的孩子交換,一直到不能交換為止,時間效...