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

排序复习_代码纯享

头文件

#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);

}


http://www.kler.cn/a/599136.html

相关文章:

  • centos7 升级MariaDB 到 10.5 或更高版本
  • 全星FMEA软件系统:FMEA、CP、PFD速效解决方案
  • 使用Github项目nghttp2的样例学习HTTP/2
  • Chrome 离线浏览器下载 教程
  • 蓝桥与力扣刷题(蓝桥 回文判定)
  • Postgresql源码(142)子查询提升pull_up_sublinks
  • OpenHarmony子系统开发 - init启动引导组件(一)
  • 基于Docker的OpenObserve快速搭建实现全链路可观测性远程管理
  • 【Tiny RDM】Redis客户端工具
  • 数据结构模拟-用栈实现队列
  • 合宙780E开发学习-搭建编程环境
  • JavaScript | 爬虫逆向 | 语法基础| 01
  • 学习笔记--基于Sa-Token 实现Java项目单点登录+同端互斥检测
  • Android在kts中简单使用AIDL
  • Layotto 是一款使用 Golang 开发的应用运行时,旨在帮助开发人员快速构建云原生应用
  • Uniapp:基于 Vue.js 的高效跨平台开发框架
  • spring.datasource.filters = stat,wall配置解释
  • PostgreSQL 触发器
  • 耘想Docker版Linux NAS的安装说明
  • MAC+PHY 的硬件连接