C++ 快排、堆排、归并排序汇总

/快排、堆排、归并/

//快排
int partition(vector<int>& nums, int low, int high) {
	//swap(nums[low], nums[(low + high) / 2]);

	srand((unsigned int)time(NULL));
	int pivPos = rand() % (high - low + 1) + low;//随机产生[low,high)作为基准
	swap(nums[low], nums[pivPos]);

	int pivot = nums[low];
	while (low < high) {
		while (low < high && nums[high] >= pivot) {
			--high;
		}
		nums[low] = nums[high];
		while (low < high && nums[low] <= pivot) {
			++low;
		}
		nums[high] = nums[low];
	}
	nums[low] = pivot;
	return low;
}
void quickSort(vector<int>& nums,int low,int high) {
	if (low < high) {
		int pivot = partition(nums, low, high);
		quickSort(nums, low, pivot - 1);
		quickSort(nums, pivot + 1, high);
	}
	return;
}

//堆排序
void buildHeap(vector<int>& a, int root, int len) {
	int lchild = root * 2 + 1;
	if (lchild < len) {
		int maxIdx = lchild;
		int rchild = lchild + 1;
		if (rchild < len) {
			if (a[rchild] > a[maxIdx]) {
				maxIdx = rchild;//保存左右节点较大值的下标
			}
		}
		if (a[root] < a[maxIdx]) {
			swap(a[root], a[maxIdx]);//交换父节点和最大子节点
			buildHeap(a, maxIdx, len);//从最大子节点处递归建堆
		}
	}
}
void heapSort(vector<int>& a, int len) {
	//初始化,i 从最后一个父节点开始调整
	for (int i = len / 2 - 1; i >= 0; i--) {
		buildHeap(a, i, len);
	}
	//将堆顶元素(最大值)和数组最后一个元素交换,再重新调整堆
	for (int i = len - 1; i > 0; i--) {
		swap(a[0], a[i]);
		buildHeap(a, 0, i);//去除最后位置元素后重新建堆,此时数组长度为 i
	}
}

//归并排序
void merge(vector<int>& arr, int low, int mid, int high) {
	//i 指向第一个有序区的第一个元素, j 指向第二有序区的第一个元素
	int i = low, j = mid + 1, k = 0;
	int* temp = new int[high - low + 1];//temp数组暂存合并的有序序列
	while (i <= mid && j <= high) {
		if (arr[i] <= arr[j]) {
			temp[k++] = arr[i++];
		}
		else {
			temp[k++] = arr[j++];
		}
	}
	while (i <= mid) {//若比较完之后,第一个有序区仍有剩余,则直接复制到t数组中
		temp[k++] = arr[i++];
	}
	while (j <= high) {
		temp[k++] = arr[j++];
	}
	for (i = low, k = 0; i <= high; i++, k++) {//将排好序的存回arr中low到high这区间
		arr[i] = temp[k];
	}
	delete []temp;
}
void mergeSort(vector<int>& arr, int low, int high) {
	if (low < high) {
		int mid = (high - low) / 2 + low;
		mergeSort(arr, low, mid);
		mergeSort(arr, mid+1, high);
		merge(arr, low, mid, high);
	}
}

int main() {
	vector<int> nums = { 5,2,8,1 ,3,2,6};

	//quickSort(nums, 0, nums.size() - 1);
	//heapSort(nums, nums.size());
	mergeSort(nums, 0, nums.size() - 1);
	for (int i = 0; i < nums.size(); i++) {
		cout << nums[i] << " ";
	}
	cout << endl;

	return 0;
}
posted @   daydayupzgz  阅读(94)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示