一些排序算法

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

//快速排序,最好和平均情况:nlog(n),最坏情况:n^2
void quicksort(vector<int>& arr, int l, int r){
	if (l >= r) return;
	int i = l, j = r;
	while (i < j) {
		while (i < j && arr[j] >= arr[l]) --j;
		while (i < j && arr[i] <= arr[l]) ++i;
		swap(arr[i], arr[j]);
	}
	swap(arr[i], arr[l]);
	quicksort(arr, l, i - 1);
	quicksort(arr, i + 1, r);
}

void quick_sort(vector<int>& arr, int l, int r) {
	if (l >= r) return;
	int i = l, j = r;
	while (i < j) {
		while (i < j && arr[j] >= arr[l]) j--;
		while (i < j && arr[i] > arr[l]) i++;
		swap(arr[i], arr[j]);
	}
	swap(arr[i], arr[l]);
	quick_sort(arr, l, i - 1);
	quick_sort(arr, i + 1, r);
}

void test02() {
	vector<vector<int>> res = { { 2, 5, 7, 4 } ,{0,2,3,6} ,{0,0,0,2,0,5}, {0,0,2,3,2,1,1,2,0,4}, {0}, {3, 6, 8, 10, 1, 2, 1}, {5, 4, 3, 2, 1}, {1, 7, 3, 9, 2, 8, 6, 4, 5}, {9, 8, 7, 6, 5, 4, 3, 2, 1} };
	for (auto& arr : res) {
		quick_sort(arr, 0, arr.size() - 1);
		for (auto num : arr) {
			cout << num << " ";
		}
		cout << endl;
	}
}


//冒泡排序,无论什么情况都是n^2
vector<int> bubblesort(vector<int> arr)
{
	int lenth = arr.size();
	for (int i = 0; i < lenth; i++)
	{
		for (int j = 0; j < lenth - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				swap(arr[j], arr[j + 1]);
			}
		}
	}
	return arr;
}

vector<int> bubblesort1(vector<int> arr) {
	for (int i = 0; i < arr.size(); ++i) {
		for (int j = 0; j < arr.size() - i - 1; ++j) {
			if (arr[j] > arr[j + 1]) swap(arr[j], arr[j + 1]);
		}
	}
	return arr;
}

//插入排序,不太熟练
vector<int> insertionsort(vector<int> arr){
	for (int i = 1; i < arr.size(); i++){
		int key = arr[i], j = i - 1;
		while (j >= 0 && key < arr[j]){
			arr[j + 1] = arr[j];
			j--;
		}
		arr[j + 1] = key;
	}
	return arr;
}

vector<int> insertionsort1(vector<int> arr) {
	for (int i = 1; i < arr.size(); ++i) {
		int key = arr[i], j = i - 1;
		while (j >= 0 && arr[j] > key) {
			arr[j + 1] = arr[j];
			j--;
		}
		j++;
		arr[j] = key;
	}
	return arr;
}

//选择排序,不太熟练
vector<int> SelectionSort(vector<int> arr) {
	for (int i = 0; i < arr.size(); ++i) {
		int min_index = i;
		for (int j = i; j < arr.size(); ++j) {
			if (arr[j] < arr[min_index]) min_index = j;
		}
		swap(arr[min_index], arr[i]);
	}
	return arr;
}

vector<int> SelectionSort1(vector<int> arr) {
	for (int i = 0; i < arr.size(); ++i) {
		int min_index = i;
		for (int j = i + 1; j < arr.size(); ++j) {
			if (arr[j] < arr[min_index]) min_index = j;
		}
		swap(arr[min_index], arr[i]);
	}
	return arr;
}

//归并排序,不太熟练
void merge_sort_(int l, int r, vector<int>& arr, vector<int>& tmp) {
	if (l >= r) return;
	int m = l + (r - l) / 2;
	int i = l, j = m + 1;
	merge_sort_(l, m, arr, tmp);
	merge_sort_(m + 1, r, arr, tmp);
	for (int k = l; k <= r; ++k) tmp[k] = arr[k];
	for (int k = l; k <= r; ++k) {
		if (i == m + 1) arr[k] = tmp[j++];
		else if (j == r + 1 || tmp[i] < tmp[j]) arr[k] = tmp[i++];
		else arr[k] = tmp[j++];
	}
}

vector<int> merge_sort(vector<int> arr) {
	vector<int> tmp(arr.size());
	merge_sort_(0, arr.size() - 1, arr, tmp);
	return arr;
}

void merge_sort_1(int l, int r, vector<int>& arr, vector<int>& tmp) {
	if (l >= r) return;
	int m = l + (r - l) / 2;
	int i = l, j = m + 1;
	merge_sort_1(l, m, arr, tmp);
	merge_sort_1(m + 1, r, arr, tmp);
	for (int k = l; k <= r; ++k) tmp[k] = arr[k];
	for (int k = l; k <= r; ++k) {
		if (i == m + 1) arr[k] = tmp[j++];
		else if (j == r + 1 || tmp[i] <= tmp[j]) arr[k] = tmp[i++];
		else arr[k] = tmp[j++];
	}
}

vector<int> merge_sort1(vector<int>& arr) {
	vector<int> tmp(arr.size());
	merge_sort_1(0, arr.size() - 1, arr, tmp);
	return arr;
}

//堆排序,不太熟练
void Heapify(vector<int>& arr, int n, int i){
	int left = i * 2 + 1, right = i * 2 + 2;
	int maxIndex = i;
	if (left < n && arr[left] > arr[maxIndex]) maxIndex = left;
	if (right < n && arr[right] > arr[maxIndex]) maxIndex = right;
	if (maxIndex != i) {
		swap(arr[i], arr[maxIndex]);
		Heapify(arr, n, maxIndex);
	}
}

vector<int> HeapSort(vector<int> arr){
	for (int i = arr.size() - 1; i >= 0; i--) {
		Heapify(arr, arr.size(), i);
	}
	for (int i = arr.size() - 1; i >= 0; i--) {
		swap(arr[i], arr[0]);
		Heapify(arr, i, 0);
	}
	return arr;
}

void Heapify1(vector<int>& arr, int n, int i) {
	int left = 2 * i + 1, right = 2 * i + 2;
	int max_index = i;
	if (left < n && arr[left] > arr[max_index]) max_index = left;
	if (right < n && arr[right] > arr[max_index]) max_index = right;
	if (max_index != i) {
		swap(arr[i], arr[max_index]);
		Heapify1(arr, n, max_index);
	}
}

vector<int> HeapSort1(vector<int>& arr) {
	int n = arr.size() - 1;
	for (int i = n; i >= 0; --i) Heapify1(arr, n + 1, i);
	for (int i = n; i >= 0; --i) {
		swap(arr[i], arr[0]);
		Heapify1(arr, i, 0);
	}
	return arr;
}



//全排序算法:
void qun() {
	vector<int> nums = { 1, 2, 3, 4 };
	do {
		cout << "-----------";
		for (int num : nums)
			cout << num << " ";
		cout << endl;
	} while (next_permutation(nums.begin(), nums.end()));
	cout << endl;
	return;
}

//测试案例
void testsort(vector<int> arr)
{
	arr = HeapSort1(arr);
	std::cout << "Sorted array: ";
	for (int i = 0; i < arr.size(); i++)
		std::cout << arr[i] << " ";
	std::cout << std::endl;
}



int main() 
{

	vector<vector<int>> arrs = { { 2, 5, 7, 4 } ,{0,2,3,6} ,{0,0,0,2,0,5}, {0,0,2,3,2,1,1,2,0,4}, {0}, {3, 6, 8, 10, 1, 2, 1}, {5, 4, 3, 2, 1}, {1, 7, 3, 9, 2, 8, 6, 4, 5}, {9, 8, 7, 6, 5, 4, 3, 2, 1} };
	for (auto &arr : arrs) testsort(arr);
	//test02();

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值