排序算法

#pragma once
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

//冒泡
void bubbleSort(vector<int>& arr)
{
	int n = arr.size();
	if (n <= 1) return;
	int temp;
	for (int i = 0; i < n - 1; ++i)
	{
		for (int j = 0; j < n - 1 - i; ++j)
		{ 
			if (arr[j] > arr[j + 1])
			{
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

//快排
void quickSort(vector<int> &q, int l, int r) {
	if (l >= r)
		return;
	int i = l - 1, j = r + 1, x = q[l + rand() % (r - l + 1)];
	while (i < j) {
		do j--; while (q[j] > x);
		do i++; while (q[i] < x);
		if (i < j)
			swap(q[i], q[j]);
		else {
			quickSort(q, l, j);
			quickSort(q, j + 1, r);
		}
	}
}


//选择
void selectionSort(vector<int> &q) {
	for (int i = 0; i < q.size(); i++) {
		for (int j = i + 1; j < q.size(); j++) {
			if (q[i] > q[j])
				swap(q[i], q[j]);
		}
	}
}

//归并
void mergeSort(vector<int> &q, int l, int r) {
	if (l >= r)
		return;
	int mid = l + r >> 1;
	mergeSort(q, l, mid);
	mergeSort(q, mid + 1, r);
	static vector<int> w;
	w.clear();
	int i = l, j = mid + 1;
	while (i <= mid && j <= r) {
		if (q[i] > q[j])
			w.push_back(q[j++]);
		else
			w.push_back(q[i++]);
	}
	while (i <= mid)
		w.push_back(q[i++]);
	while (j <= mid)
		w.push_back(q[j++]);
	for (int i : w)
		q[l++] = i;
}

//希尔
void shellSort(vector<int> &q) {
	int gap = q.size() / 2;
	while (gap) {
		for (int i = gap; i < q.size(); i += gap) {
			int t = q[i], j;
			for (j = i - gap; j >= 0; j -= gap) {
				if (q[j] > t)
					q[j + gap] = q[j];
				else
					break;
			}
			q[j + gap] = t;
		}
		gap /= 2;
	}
}


//桶排
void push_down(vector<int>& heap, int size, int u) {
	int t = u, left = u * 2, right = u * 2 + 1;
	if (left <= size && heap[left] > heap[t])
		t = left;
	if (right <= size && heap[right] > heap[t])
		t = right;
	if (u != t) {
		swap(heap[u], heap[t]);
		push_down(heap, size, t);
	}
}

void push_up(vector<int>& heap, int u) {
	while (u / 2 && heap[u / 2] < heap[u]) {
		swap(heap[u / 2], heap[u]);
		u /= 2;
	}
}

void heapSort(vector<int> &q, int n) {
	int size = n;
	for (int i = 1; i <= n; i++)
		push_up(q, i);
	for (int i = 1; i <= n; i++) {
		swap(q[1], q[size]);
		size--;
		push_down(q, size, 1);
	}
}


//计数
void countingSort(vector<int> &q, int n) {
	vector<int> cnt(101, 0);
	for (int i = 0; i < n; i++)
		cnt[q[i]]++;
	for (int i = 0, k = 0; i <= 100; i++) {
		while (cnt[i]) {
			q[k++] = i;
			cnt[i]--;
		}
	}
}



//基数
//这里设所有待排序的数都不超过三位数,也就是说不超过999。

int get(int x, int i) {
	while (i--)
		x /= 10;
	return x % 10;
}

void radixSort(vector<int> &q, int n) {
	vector<vector<int>> cnt(10);
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 10; j++)
			cnt[j].clear();
		for (int j = 0; j < n; j++)
			cnt[get(q[j], i)].push_back(q[j]);
		for (int j = 0, k = 0; j < 10; j++) {
			for (int x : cnt[j])
				q[k++] = x;
		}
	}
}



全部评论

相关推荐

有没有友友知道hr面会问什么我应该反问什么?还有如何防止hr套话啊?还有应该如果催hr推进快一点#字节#OPPO#hr面
牛客989988346号:职业规划,优缺点,为什么选择这个岗,对应聘公司产品的了解和满意度,如果让你改进公司产品你会怎么做,对ai(新技术)的了解,有无其他offer,什么时候能到岗
点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客501015981号:前面志愿结束了,在大池子里面被其他部门捞了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务