C++常见排序算法

1. 直接插入排序

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int n;
	cin >> n;
	vector<int> arr(n + 1, 0);
	for (int i = 1; i <= n; ++i)
		cin >> arr[i];
	for (int i = 2; i <= n; ++i)
		if (arr[i] < arr[i - 1]) {
			arr[0] = arr[i];
			int j;
			for (j = i - 1; arr[0] < arr[j]; j--)
				arr[j + 1] = arr[j];
			arr[j + 1] = arr[0];
		}
	for (int i = 1; i <= n; ++i)
		cout << arr[i] << " ";
	cout << endl;
	return 0;
}

2. 二分插入排序

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int n;
	cin >> n;
	vector<int> arr(n + 1, 0);
	for (int i = 1; i <= n; ++i)
		cin >> arr[i];
	for (int i = 2; i <= n; ++i) {
		arr[0] = arr[i];
		int low = 1, high = i - 1;
		while (low <= high) {
			int mid = low + (high - low) / 2;
			if (arr[0] < arr[mid])
				high = mid - 1;
			else
				low = mid + 1;
		}
		int j;
		for (j = i - 1; j > high; j--)
			arr[j + 1] = arr[j];
		arr[j + 1] = arr[0];
	}
	for (int i = 1; i <= n; ++i)
		cout << arr[i] << " ";
	cout << endl;
	return 0;
}
}

3. 希尔排序

在这里插入图片描述

#include <iostream>
#include <vector>
using namespace std;

void insertI(vector<int>& arr, int gap, int i) {   //插入排序
	int inserted = arr[i];
	int j;
	for (j = i - gap; j >= 0 && inserted < arr[j]; j -= gap)
		arr[j + gap] = arr[j];
	arr[j + gap] = inserted;
}

void shellSort(vector<int>& arr) {    //分组
	int n = arr.size();
	for (int gap = n / 2; gap > 0; gap /= 2)
		for (int i = gap; i < n; ++i)
			insertI(arr, gap, i);
}

int main() {
	int n;
	cin >> n;
	vector<int> arr(n, 0);
	for (int i = 0; i < n; ++i)
		cin >> arr[i];
	shellSort(arr);
	for (int i = 0; i < n; ++i)
		cout << arr[i] << " ";
	cout << endl;
	return 0;
}

4. 冒泡排序

#include <iostream>
#include <vector>
using namespace std;

int partition(vector<int>& arr, int low, int high) {    //找分割点
	int pivot = arr[low];
	while (low < high) {
		while (low < high && arr[high] >= pivot)
			high--;
		arr[low] = arr[high];
		while (low < high && arr[low] <= pivot)
			low++;
		arr[high] = arr[low];
	}
	arr[low] = pivot;
	return low;
}

void quickSort(vector<int>& arr, int low, int high) {   
	if (low < high) {
		int pivotloc = partition(arr, low, high);
		quickSort(arr, low, pivotloc - 1);
		quickSort(arr, pivotloc + 1, high);
	}
}

int main() {
	int n;
	cin >> n;
	vector<int> arr(n, 0);
	for (int i = 0; i < n; ++i)
		cin >> arr[i];
	quickSort(arr, 0, n - 1);
	for (int i = 0; i < n; ++i)
		cout << arr[i] << " ";
	cout << endl;
	return 0;
}

6. 简单选择排序

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int n;
	cin >> n;
	vector<int> arr(n, 0);
	for (int i = 0; i < n; ++i)
		cin >> arr[i];
	for (int i = 0; i < n - 1; ++i) {    //找到最小数的索引
		int index = i;
		for (int j = i + 1; j < n; ++j)
			if (arr[j] < arr[index])
				index = j;
		if (index != i) {
			int temp = arr[i];
			arr[i] = arr[index];
			arr[index] = temp;
		}
	}
	for (int i = 0; i < n; ++i)
		cout << arr[i] << " ";
	cout << endl;
	return 0;
}

7. 堆排序(小根堆)

小根堆排序后的输出是降序排列

#include <iostream>
#include <vector>
using namespace std;

void minHeapDown(vector<int>& arr, int start, int end) {
	int cur = start;
	int left = 2 * cur + 1;
	int temp = arr[cur];
	for (; left <= end; cur = left, left = 2 * left + 1) {
		if (left < end && arr[left] > arr[left + 1])
			left++;
		if (temp <= arr[left])
			break;
		else {
			arr[cur] = arr[left];
			arr[left] = temp;
		}
	}
}

void heapSortIncr(vector<int>& arr, int n) {
	int temp = 0;
	for (int i = n / 2 - 1; i >= 0; i--)
		minHeapDown(arr, i, n - 1);
	for (int i = n - 1; i > 0; i--) {
		temp = arr[0];
		arr[0] = arr[i];
		arr[i] = temp;
		minHeapDown(arr, 0, i - 1);
	}
}

int main() {
	int n;
	cin >> n;
	vector<int> arr(n, 0);
	for (int i = 0; i < n; ++i)
		cin >> arr[i];
	heapSortIncr(arr, n);
	for (int i = 0; i < n; ++i)
		cout << arr[i] << " ";
	cout << endl;
	return 0;
}

8. 堆排序(大根堆)

大根堆排序后的输出时升序排列

#include <iostream>
#include <vector>
using namespace std;
void maxHeapDown(vector<int>& arr, int start, int end) {
	int cur = start;
	int left = 2 * cur + 1;
	int temp = arr[cur];
	for (; left <= end; cur = left, left = 2 * left + 1) {
		if (left < end && arr[left] < arr[left + 1])
			left++;
		if (temp >= arr[left])
			break;
		else {
			arr[cur] = arr[left];
			arr[left] = temp;
		}
	}
}
void heapSortIncr(vector<int>& arr, int n) {
	int temp = 0;
	for (int i = n / 2 - 1; i >= 0; i--)
		maxHeapDown(arr, i, n - 1);
	for (int i = n - 1; i > 0; i--) {
		temp = arr[0];
		arr[0] = arr[i];
		arr[i] = temp;
		maxHeapDown(arr, 0, i - 1);
	}
}
int main() {
	int n;
	cin >> n;
	vector<int> arr(n, 0);
	for (int i = 0; i < n; ++i)
		cin >> arr[i];
	heapSortIncr(arr, n);
	for (int i = 0; i < n; ++i)
		cout << arr[i] << " ";
	cout << endl;
	return 0;
}

9. 归并排序

#include <iostream>
#include <vector>
using namespace std;

void Merge(vector<int>& arr, int low, int mid, int high) {   //归并
	int i = low, j = mid + 1, k = 0;   //将数组分成两部分
	vector<int> temp(high - low + 1);  //开辟一个临时数组
	while (i <= mid && j <= high) {    //
		if (arr[i] <= arr[j])
			temp[k++] = arr[i++];
		else
			temp[k++] = arr[j++];
	}
	while (i <= mid)
		temp[k++] = arr[i++];
	while (j <= high)
		temp[k++] = arr[j++];
	k = 0;
	while(low<=high)
		arr[low++] = temp[k++];
}

void mergeSort(vector<int>& arr, int low, int high) {
	if (low < high) {
		int mid = low + (high - low) / 2;
		mergeSort(arr, low, mid);
		mergeSort(arr, mid + 1, high);
		Merge(arr, low, mid, high);
	}
}

int main() {
	int n;
	cin >> n;
	vector<int> arr(n, 0);
	for (int i = 0; i < n; ++i)
		cin >> arr[i];
	mergeSort(arr, 0, n-1);
	for (int i = 0; i < n; ++i)
		cout << arr[i] << " ";
	cout << endl;
	return 0;
}

10.基数排序

在这里插入图片描述

#include <iostream>
#include <vector>
using namespace std;

void radixSort(vector<int>& arr, int n) {
	int max = arr[0];
	for (int i = 1; i < n; ++i)
		max = max > arr[i] ? max : arr[i];  //找最大值
	for (int i = 1; max / i > 0; i *= 10) {  //按个位入桶->按十位入桶->...
		vector<vector<int>> buckets(10, vector<int>(n, -1));  //10个桶
		for (int j = 0; j < n; ++j) {
			int num = arr[j] / i % 10;
			buckets[num][j] = arr[j];
		}
		int index = 0;
		for (int j = 0; j < 10; ++j)  //按个位排序取出->按十位排序取出->...
			for (int k = 0; k < n; ++k)
				if (buckets[j][k] != -1)
					arr[index++] = buckets[j][k];
	}
}

int main() {
	int n;
	cin >> n;
	vector<int> arr(n, 0);
	for (int i = 0; i < n; ++i)
		cin >> arr[i];
	radixSort(arr, n);
	for (int i = 0; i < n; ++i)
		cout << arr[i] << " ";
	cout << endl;
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值