当前位置: 首页 > news >正文

排序复习_代码纯享

头文件

#pragma once
#include<iostream>
#include<vector>
#include<utility>
using std::vector;
using std::cout;
using std::cin;
using std::endl;
using std::swap;

//插入排序
//1、直接插入排序(稳定)
void InsertSort(vector<int>& v);
//2、希尔排序
void ShellSort(vector<int>& v);

//选择排序
//1、直接选择排序
void SelectSort(vector<int>& v);
//2、堆排序
void HeapSort(vector<int>& v);

//交换排序
//1、冒泡排序(稳定)
void BubbleSort(vector<int>& v);
//2、快速排序
void QuickSortTest(vector<int>& v);

//归并排序(稳定)
void MergeSort(vector<int>& arr, int left, int right);

//计数排序
void CountSort(vector<int>& v);

void Print(vector<int>& v);

排序代码

#define  _CRT_SECURE_NO_WARNINGS
#include"sort.h"

void Print(vector<int>& v) {
	for (int e : v) {
		cout << e << " ";
	}
	cout << endl;
}

void InsertSort(vector<int>&v) {
	int n = v.size();
	for (int i = 0; i < n - 1; i++) {
		int end = i;
		int tmp = v[end + 1];
		while (end >= 0) {
			if (tmp < v[end]) {
				v[end + 1] = v[end];
				--end;
			}
			else {
				break;
			}
		}
		v[end + 1] = tmp;
	}
}

void ShellSort(vector<int>& v) {
	int n = v.size();
	int gap = n;
	while (gap > 1) {
		gap = gap / 3 + 1;
		for (int i = 0; i < n - gap; ++i) {
			int end = i;
			int tmp = v[end + gap];
			while (end >= 0) {
				if (v[end] > tmp) {
					v[end + gap] = v[end];
					end = end - gap;
				}
				else {
					break;
				}
			}
			v[end + gap] = tmp;
		}
	}
}

void SelectSort(vector<int>& v) {
	int n = v.size();
	int begin = 0, end = n - 1;
	while (begin < end) {
		int mini = begin;
		int maxi = end;
		for (int i = begin + 1; i < end; i++) {
			if (v[mini] > v[i]) {
				mini = i;
			}
			if (v[maxi] < v[i]) {
				maxi = i;
			}
		}
		swap(v[mini], v[begin]);
		if (maxi == begin) {
			maxi = mini;
		}
		swap(v[maxi], v[end]);
		++begin;
		--end;
	}
}

void AdjustDown(vector<int>& v, int parent, int size) {
	int n = size;
	int child = parent * 2 + 1;
	while (child < n) {
		if (child + 1 < n && v[child + 1] > v[child]) {
			++child;
		}
		if (v[child] > v[parent]) {
			swap(v[child], v[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else {
			break;
		}
	}
}

void HeapSort(vector<int>& v) {
	int n = v.size();
	for (int i = (n - 2) / 2; i >= 0; i--) {
		AdjustDown(v, i, n);
	}
	int end = n - 1;
	while (end) {
		swap(v[0], v[end]);
		AdjustDown(v, 0, end);
		--end;
	}
}

void BubbleSort(vector<int>& v) {
	int n = v.size();
	for (int j = 0; j < n; j++) {
		bool exchange = false;
		for (int i = 1; i < n - j; i++) {
			if (v[i] < v[i - 1]) {
				swap(v[i], v[i - 1]);
				exchange = true;
			}
		}
		if (exchange == false)
			break;
	}
}

void QuickSort(vector<int>& v, int begin, int end) {
	if (begin >= end)
		return;
	int left = begin;
	int right = end;
	int key = begin;
	while (left < right) {
		while (left < right && v[right] >= v[key]) {
			right--;
		}
		while (left < right && v[left] <= v[key]) {
			left++;
		}
		swap(v[right], v[left]);
	}
	swap(v[key], v[left]);
	key = left;
	//begin  key  end
	QuickSort(v, begin, key - 1);
	QuickSort(v, key + 1, end);
}

void QuickSortTest(vector<int>& v) {
	int n = v.size();
	int begin = 0;
	int end = n - 1;
	QuickSort(v, begin, end);
}
 
// 合并两个已排序的子数组
void Merge(vector<int>& arr, int left, int mid, int right) {
	int n1 = mid - left + 1;
	int n2 = right - mid;

	// 创建临时数组
	vector<int> L(n1), R(n2);

	// 拷贝数据到临时数组 L[] 和 R[]
	for (int i = 0; i < n1; i++)
		L[i] = arr[left + i];
	for (int j = 0; j < n2; j++)
		R[j] = arr[mid + 1 + j];

	// 归并临时数组到 arr[left..right]
	int i = 0; // 初始化第一个子数组的索引
	int j = 0; // 初始化第二个子数组的索引
	int k = left; // 初始归并子数组的索引

	while (i < n1 && j < n2) {
		if (L[i] <= R[j]) {
			arr[k] = L[i];
			i++;
		}
		else {
			arr[k] = R[j];
			j++;
		}
		k++;
	}

	// 拷贝 L[] 的剩余元素
	while (i < n1) {
		arr[k] = L[i];
		i++;
		k++;
	}

	// 拷贝 R[] 的剩余元素
	while (j < n2) {
		arr[k] = R[j];
		j++;
		k++;
	}
}

// 归并排序函数
void MergeSort(vector<int>& arr, int left, int right) {
	if (left < right) {
		// 找到中间点
		int mid = left + (right - left) / 2;

		// 递归排序左半部分
		MergeSort(arr, left, mid);
		// 递归排序右半部分
		MergeSort(arr, mid + 1, right);

		// 合并已排序的两部分
		Merge(arr, left, mid, right);
	}


void CountSort(vector<int>& v) {
	int n = v.size();
	int max = v[0];
	int min = v[0];
	for (int i = 0; i < n; i++) {
		if (v[i] < min)
			min = v[i];
		if (v[i] > max)
			max = v[i];
	}
	int range = max - min + 1;
	vector<int> count(range, 0);

	//统计每个元素出现的次数
	for (int num : v) {
		++count[num - min];
	}
	//输出
	int j = 0;
	for (int i = 0; i < range; i++) {
		while (count[i]) {
			v[j] = i + min;
			j++;
			count[i]--;
		}
	}
}

测试排序代码

#define  _CRT_SECURE_NO_WARNINGS
#include"sort.h"

int main() {
	vector<int> v = { 3,5,1,4,2,7,6 };
	Print(v);

	//InsertSort(v);
	//ShellSort(v);
	//SelectSort(v);
	//BubbleSort(v);
	//HeapSort(v);
	//QuickSortTest(v);
	MergeSort(v, 0, 6);
	Print(v);

}

相关文章:

  • batman-adv 优化:基于信号强度(RSSI)选择链路
  • SpringCloud配置中心:Config Server与配置刷新机制
  • 使用 Python 和 python-pptx 构建 Markdown 到 PowerPoint 转换器
  • 华为OD机试 - 核酸最快检测效率 - 动态规划、背包问题(Java 2024 E卷 200分)
  • 深入理解 HTML5 Web Workers:提升网页性能的关键技术解析
  • 基礎複分析習題3.複函數
  • 今天你学C++了吗?——二叉搜索树的拓展
  • API-Arrays
  • 【Python爬虫】使用python脚本拉取汽车网站品牌数据
  • 1.NextJS基础
  • skynet网络包库(lua-netpack.c)的作用解析
  • 关于大数据的基础知识(四)——大数据的意义与趋势
  • AQS是什么,使用应注意什么
  • 【CXX-Qt】4.5 Traits
  • 【AndroidRTC-11】如何理解webrtc的Source、TrackSink
  • QML指示控件:ScrollBar与ScrollIndicator
  • 【江协科技STM32】Unix时间戳(学习笔记)
  • java 设置操作系统编码、jvm平台编码和日志文件编码都为UTF-8的操作方式
  • AI Agent开发大全第八课-Stable Diffusion 3的本地安装全步骤
  • FreeRTOS学习(九):中断管理
  • 新干式二尖瓣瓣膜国内上市,专家:重视瓣膜病全生命周期管理
  • 高璞任中国一汽党委常委、副总经理
  • 最高法专门规范涉企案件审执工作:从源头防止趋利性执法司法
  • 文化体验+商业消费+服务创新,上海搭建入境旅游新模式
  • 单位被裁定补缴12年社保,滞纳金该谁出?
  • 美联储官员:若特朗普高额关税致失业率飙升,将支持降息