常用排序模板

冒泡排序

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); //對右子區間遞歸 
	}
}

歸併排序

注意iijj的下標判斷是取等號

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章