排序算法

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



全部评论

相关推荐

07-11 11:15
中南大学 Java
好可爱的hr姐姐哈哈哈哈
黑皮白袜臭脚体育生:兄弟们貂蝉在一起,吕布开了
点赞 评论 收藏
分享
水墨不写bug:疑似没有上过大学
点赞 评论 收藏
分享
06-23 11:43
门头沟学院 Java
allin校招的烤冷...:我靠,今天中午我也是这个hr隔一个星期发消息给我。问的问题还是一模一样的😅
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务