冒泡排序
void bubbleSort(int arr[], int n){
for(int i = 0; i < n - 1; i++){
for(int j = 1; j < n - i; j++){
if(arr[j-1] > arr[j]) swap(arr[j-1], arr[j]);
}
}
}
插入排序
void insertSort(int arr[], int n){
for(int i = 1; i < n; i++){
int tmp = arr[i];
int j = i;
while(j >= 0 && arr[j] >= tmp) arr[j] = arr[--j];
arr[j + 1] = tmp;
}
}
選擇排序
void selectSort(int arr[], int n){
for(int i = 0; i < n; i++){
int k = i;
for(int j = i+1; j < n; j++){
if(arr[k] > arr[j]) k = j;
}
swap(arr[i], arr[k]);
}
}
堆排序
建議去B站看正月點燈籠的視頻
void heapify(int arr[], int n, int i){
if(i >= n) return ;
int l = 2 * i + 1;
int r = 2 * i + 2;
int max = i;
if(l < n && arr[l] > arr[max]) max = l;
if(r < n && arr[r] > arr[max]) max = r;
if(max != i){
swap(arr[i], arr[max]);
heapify(arr, n, max); //max代表的就是左右孩子的下標
}
}
void heapSort(int arr[], int n){
int last_node = n - 1;
int parent = (last_node - 1) / 2;
for(int i = parent; i >= 0; i--){ //調整堆
heapify(arr, n, i);
}
for(int i = n - 1; i >= 0; i--){
swap(arr[0], arr[i]);
heapify(arr, i, 0); //0~i之間的數進行調整
}
}
快速排序
int partition(int arr[], int L, int R){
int tmp = arr[L];
while(L < R){
while(L < R && arr[R] > tmp) R--;
arr[L] = arr[R];
while(L < R && arr[L] <= tmp) L++;
arr[R] = arr[L];
}
arr[L] = tmp;
return L;
}
void quickSort(int arr[], int L, int R){
if(L < R){
int mid = partition(arr, L, R);
quickSort(arr, L, mid - 1); //對左子區間遞歸
quickSort(arr, mid + 1, R); //對右子區間遞歸
}
}
歸併排序
注意和的下標判斷是取等號
void merge(int arr[], int L1, int R1, int L2, int R2){
int t[R2-L1 + 2], id = 0;
int i = L1, j = L2;
while(i <= R1 && j <= R2){
if(arr[i] < arr[j]){
t[id] = arr[i];
id++, i++;
}else{
t[id] = arr[j];
id++, j++;
}
}
while(i <= R1) t[id] = arr[i], id++, i++;
while(j <= R2) t[id] = arr[j], id++, j++;
for(int k = 0; k < id; k++){
arr[L1 + k] = t[k];
}
}
void mergeSort(int arr[], int L, int R){
if(L < R){
int mid = (L + R) >> 1;
mergeSort(arr, L, mid);
mergeSort(arr, mid + 1, R);
merge(arr, L, mid, mid + 1, R);
}
}
主函數
int main(){
int arr[]={1,7,5,3,6,4,2,0,0};
int n = 9;
// bubbleSort(arr, n);
// insertSort(arr, n);
// selectSort(arr, n);
// mergeSort(arr, 0, n - 1); //左右邊界
// heapSort(arr, n);
quickSort(arr, 0, n - 1);
for(auto x: arr){
cout<<x<<" ";
}
return 0;
}