排序算法合集(简单选择排序,插入排序,希尔排序,堆排序,冒泡排序,快速排序

1.插入排序

插入排序是每次将一个数插入到前面已经排好序的部分中

实现代码:

void InsertSort(vector<int> &nums) {
	cout << "插入排序" << endl;
	int i, j, temp;
	for (i = 1; i < nums.size(); i++) {
		if (nums[i] < nums[i - 1]) {
			temp = nums[i];
			for (j = i - 1; j >= 0 && nums[j] > temp; j--) {
				nums[j + 1] = nums[j];
			}
			nums[j+1] = temp;
		}
		PrintNums(nums);
	}
}

 时间复杂度:

最好情况(原本全部有序) O(n)

最坏情况(逆序)  o(n2)

平均时间复杂度o(n2)

稳定性:稳定

优化思路:

可以将插入位置的搜索改为二分查找

2.希尔排序

将原来序列分成多个子表,不断对子表进行插入排序。缩小子表中元素的间距直到d=1时停止

实现代码

void ShellSort(vector<int>& nums) {
	cout << "希尔排序" << endl;
	vector<int> dNums = { 5,3,1 };
	int i,j,temp;
	for (int d : dNums) {
		for (i = d; i < nums.size(); i++) {
			if (nums[i] < nums[i - d]) {
				temp = nums[i];
				for (j = i - d; j >= 0 && temp < nums[j]; j -= d) {
					nums[j + d] = nums[j];
				}
				nums[j + d] = temp;
			}
			PrintNums(nums);
		}
	}

 时间复杂度:与增量序列d有关,最坏为o(n2)

稳定性:不稳定

3.快速排序

在待排序表中取数枢轴元素,通过一趟排序将原表划分成为左边小于枢轴右边大于枢轴的两部分。然后分别递归地对两个子表重复上述过程。

代码:

int Partition(vector<int>& nums, int low, int high) {
	int pivot = nums[low];
	while (low < high) {
		while (low < high && nums[high] >= pivot) --high;
		nums[low] = nums[high];
		while (low < high && nums[low] <= pivot) ++low;
		nums[high] = nums[low];
	}
	nums[low] = pivot;
	return low;
}
void QuickSort(vector<int>& nums,int low,int high) {
	PrintNums(nums);
	if (low < high) {
		int pivot = Partition(nums, low, high);
		QuickSort(nums, low, pivot - 1);
		QuickSort(nums, pivot + 1, high);
	}
}

 时间复杂度:

最好O(nlog2n)

最坏O(n2)

空间复杂度

最好o(log2n)

最坏o(n)

稳定性

不稳定

4.简单选择排序

在每一轮的排序元素中选择最小的加入有序子序列

代码

void EasySort(vector<int>& nums) {
	cout << "简单选择排序" << endl;
	int temp;
	for (int i = 0; i < nums.size()-1; i++) {
		int min = i;
		for (int j = i+1; j < nums.size(); j++) {
			if (nums[j] < nums[min]) {
				min = j;
			}
		}
		swap(nums[i], nums[min]);
		PrintNums(nums);
	}
}

时间复杂度o(n2)

稳定性:不稳定

优化:每一轮排序中同时选择最小的和最大的元素

void EasySort2(vector<int>& nums) {
	cout << "简单选择排序2" << endl;
	int i, j, min, max;
	for(i = 0 ; i < nums.size()-1-i;i++){
		min = max = i;
		for (j = i + 1; j < nums.size() - i; j++) {
			if (nums[j] < nums[min]) min = j;
			else if (nums[j] > nums[max]) max = j;
		}
		if (min != i) {
			Swap(nums[min], nums[i]);
		}
		if (max != nums.size() - i - 1) {
			if (max==i) Swap(nums[min],nums[nums.size()-i-1]);
			else Swap(nums[max], nums[nums.size() - i - 1]);
		}
	}
	PrintNums(nums);
}

5.堆排序

建立大根堆,每一趟选出堆顶元素加入序列

void HeapAdjust(vector<int>& nums, int k,int len) {
	int temp = nums[k];
	for (int i = 2 * k; i < len; i *= 2) {
		if (i < len - 1 && nums[i] < nums[i + 1]) i++;
		if (temp >= nums[i]) break;
		else {
			nums[k] = nums[i];
			k = i;
		}
	}
	nums[k] = temp;
}
void BuildMaxHeap(vector<int>& nums) {
	for (int i = nums.size()/ 2; i >= 0; i--)
		HeapAdjust(nums, i,nums.size());
}
void HeapSort(vector<int>& nums) {
	cout << "堆排序" << endl;
	BuildMaxHeap(nums);
	for (int i = nums.size() - 1; i > 0; i--) {
		swap(nums[i], nums[0]);
		HeapAdjust(nums, 0,i);
		PrintNums(nums);
	}
}

时间复杂度 o(nlog2n),不稳定

6.冒泡排序

这个不单独写了看下面的总代码吧

总代码:

#include<iostream>
#include<vector>
using namespace std;
void PrintNums(vector<int> nums) {
	for (int i = 0; i < nums.size(); i++) {
		cout << nums[i] << " ";
	}
	cout << endl;
}
void Swap(int& a, int& b) {
	int temp;
	temp = a;
	a = b;
	b = temp;
}
void InsertSort(vector<int> &nums) {
	cout << "插入排序" << endl;
	int i, j, temp;
	for (i = 1; i < nums.size(); i++) {
		if (nums[i] < nums[i - 1]) {
			temp = nums[i];
			for (j = i - 1; j >= 0 && nums[j] > temp; j--) {
				nums[j + 1] = nums[j];
			}
			nums[j+1] = temp;
		}
		PrintNums(nums);
	}
}
void ShellSort(vector<int>& nums) {
	cout << "希尔排序" << endl;
	vector<int> dNums = { 5,3,1 };
	int i,j,temp;
	for (int d : dNums) {
		for (i = d; i < nums.size(); i++) {
			if (nums[i] < nums[i - d]) {
				temp = nums[i];
				for (j = i - d; j >= 0 && temp < nums[j]; j -= d) {
					nums[j + d] = nums[j];
				}
				nums[j + d] = temp;
			}
			PrintNums(nums);
		}
	}
}
int Partition(vector<int>& nums, int low, int high) {
	int pivot = nums[low];
	while (low < high) {
		while (low < high && nums[high] >= pivot) --high;
		nums[low] = nums[high];
		while (low < high && nums[low] <= pivot) ++low;
		nums[high] = nums[low];
	}
	nums[low] = pivot;
	return low;
}
void QuickSort(vector<int>& nums,int low,int high) {
	PrintNums(nums);
	if (low < high) {
		int pivot = Partition(nums, low, high);
		QuickSort(nums, low, pivot - 1);
		QuickSort(nums, pivot + 1, high);
	}
}
void EasySort(vector<int>& nums) {
	cout << "简单选择排序" << endl;
	int temp;
	for (int i = 0; i < nums.size()-1; i++) {
		int min = i;
		for (int j = i+1; j < nums.size(); j++) {
			if (nums[j] < nums[min]) {
				min = j;
			}
		}
		swap(nums[i], nums[min]);
		PrintNums(nums);
	}
}
void EasySort2(vector<int>& nums) {
	cout << "简单选择排序2" << endl;
	int i, j, min, max;
	for(i = 0 ; i < nums.size()-1-i;i++){
		min = max = i;
		for (j = i + 1; j < nums.size() - i; j++) {
			if (nums[j] < nums[min]) min = j;
			else if (nums[j] > nums[max]) max = j;
		}
		if (min != i) {
			Swap(nums[min], nums[i]);
		}
		if (max != nums.size() - i - 1) {
			if (max==i) Swap(nums[min],nums[nums.size()-i-1]);
			else Swap(nums[max], nums[nums.size() - i - 1]);
		}
	}
	PrintNums(nums);
}
void HeapAdjust(vector<int>& nums, int k,int len) {
	int temp = nums[k];
	for (int i = 2 * k; i < len; i *= 2) {
		if (i < len - 1 && nums[i] < nums[i + 1]) i++;
		if (temp >= nums[i]) break;
		else {
			nums[k] = nums[i];
			k = i;
		}
	}
	nums[k] = temp;
}
void BuildMaxHeap(vector<int>& nums) {
	for (int i = nums.size()/ 2; i >= 0; i--)
		HeapAdjust(nums, i,nums.size());
}
void HeapSort(vector<int>& nums) {
	cout << "堆排序" << endl;
	BuildMaxHeap(nums);
	for (int i = nums.size() - 1; i > 0; i--) {
		swap(nums[i], nums[0]);
		HeapAdjust(nums, 0,i);
		PrintNums(nums);
	}
}
void BubbleSort(vector<int>& nums){
	cout << "冒泡排序" << endl;
	for (int i = 0; i < nums.size()-1; i++) {
		for (int j = 0; j < nums.size() - i -1; j++) {
			if (nums[j] > nums[j + 1]) {
				swap(nums[j], nums[j + 1]);
			}
		}
		PrintNums(nums);
	}
}
void HeapDelete(vector<int>& nums) {
	BuildMaxHeap(nums);
	PrintNums(nums);
	cout << "输入要删除的元素位置(0<i<"<<nums.size()-1<<")" << endl;
	int i;
	cin >> i;
	nums[i] = nums[nums.size() - 1];
	nums.pop_back();
	HeapAdjust(nums, i, nums.size() - 1);
	PrintNums(nums);
}
int main() {
	while (1) {
		vector<int> nums = { 265,301,751,129,937,863,742,694,76,438 };
		int type;
		cout << "(1)简单选择排序(2)堆排序(3)直接插入排序(4)希尔排序(增量分别为5、3、1)(5)冒泡排序(6)快速排序(7)删除堆元素" << endl;
		cin >> type;
		switch (type)
		{
		case 1:
			EasySort2(nums);
			break;
		case 2:
			HeapSort(nums);
			break;
		case 3:
			InsertSort(nums);
			break;
		case 4:
			ShellSort(nums);
			break;
		case 5:
			BubbleSort(nums);
			break;
		case 6:
			QuickSort(nums, 0, nums.size() - 1);
			break;
		case 7:
			cout << "堆删除元素" << endl;
			HeapDelete(nums);
			break;
		default:
			break;
		}
	}
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值