数据结构与算法学习笔记(二)——九大排序

1.冒泡排序

        双循环相邻项大小比较进行排序。

        时间复杂度:O(n^2)
        空间复杂度:O(1)
        稳定

2.选择排序

        双循环选择最小项(最大项)进行比较排序。
        时间复杂度:O(n^2)
        空间复杂度:O(1)
        不稳定

3.插入排序

        双循环找到元素当前有序位置进行插入。
        时间复杂度:O(n^2)
        空间复杂度:O(1)
        稳定

4.希尔排序

        分组插入排序

        时间复杂度:O(n^2)->n^1.3
        空间复杂度:O(1)
        不稳定

5.计数排序

        找到排序数组中最大数,开辟以最大数+1为容量的数组,遍历排序数组,排序数组值对应新数组下标进行计数,最后再顺序取出。

        时间复杂度:O(n)
        空间复杂度:O(N)
        不稳定

6.桶排序

        分类计数排序。

        时间复杂度:O(N+C)
        空间复杂度:O(M+C)
        稳定性取决于C

7.堆排序

        采用二叉树的方式,构建最大堆,将根元素(最大值)放在数组末尾。

        时间复杂度:O(nlogn)
        空间复杂度:O(1)
        不稳定

8.归并排序

        采用迭代的方式,进行分类局部排序。

        时间复杂度:O(nlogn)
        空间复杂度:O(m)
        不稳定

9.快速排序

        采用迭代的方式,二分分割数组进行排序。

        时间复杂度:O(nlogn)
        空间复杂度:O(1)
        不稳定

代码

//Mysort.h
#pragma once
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
class Mysort {
public:
	//冒泡排序
	void Bubblesort(vector<int>& vec);
	//选择排序
	void Selectsort(vector<int>& vec);
	//插入排序
	void Insertsort(vector<int>& vec);
	//希尔排序
	void Shellsort(vector<int>& vec);
	void Shellinsert(vector<int>& vec, int start, int gap);
	//计数排序
	void Countsort(vector<int>& vec);
	//桶排序
	void Bucketsort(vector<int>& vec);
	//堆排序
	void Heapsort(vector<int>& vec);
	void HeapMax(vector<int>& vec, int start, int end);
	//归并排序
	void Mergedevide(vector<int>& vec, int left, int right);
	void Mergesort(vector<int>& vec, int left, int mid, int right);
	//快速排序
	void Quicksort(vector<int>& vec, int left, int right);
private:
};
//Mysort.cpp

#include"mysort.h"

//冒泡排序
//时间复杂度:O(n^2)
//空间复杂度:O(1)
//稳定
void Mysort::Bubblesort(vector<int>& vec) {
	for (int i = 0; i < vec.size() - 1; i++) {
		bool flag = true;
		for (int j = 0; j < vec.size() - i - 1; j++) {
			if (vec[j] >= vec[j + 1]) {
				swap(vec[j], vec[j + 1]);
				flag = false;
			}
		}
		if (flag) break;
	}
}

//选择排序
//时间复杂度:O(n^2)
//空间复杂度:O(1)
//不稳定
void Mysort::Selectsort(vector<int>& vec) {
	for (int i = 0; i < vec.size(); i++) {
		int minindex = i;
		for (int j = i; j < vec.size(); j++) {
			if (vec[j] < vec[minindex]) {
				minindex = j;
			}
		}
		swap(vec[i], vec[minindex]);
	}
}

//插入排序
//时间复杂度:O(n^2)
//空间复杂度:O(1)
//稳定
void Mysort::Insertsort(vector<int>& vec) {
	for (int i = 0; i < vec.size()-1; i++) {
		int temp = vec[i + 1];
		for (int j = 0; j <= i; j++) {
			if (vec[i + 1] < vec[j]) {
				for (int k = i + 1; k > j; k--) {
					vec[k] = vec[k - 1];
				}
				vec[j] = temp;
			}
		}
	}
}
//希尔插入
void Mysort::Shellinsert(vector<int>& vec, int start, int gap) {
	for (int i = start; i < vec.size() - gap; i+=gap) {
		int temp = vec[i + gap];
		for (int j = start; j <= i; j+=gap) {
			if (vec[i + gap] < vec[j]) {
				for (int k = i + gap; k > j; k-=gap) {
					vec[k] = vec[k - gap];
				}
				vec[j] = temp;
			}
		}
	}
}
//希尔排序
//时间复杂度:O(n^2)->n^1.3
//空间复杂度:O(1)
//不稳定
void Mysort::Shellsort(vector<int>& vec) {
	for (int gap = vec.size() / 2; gap >= 1; gap /= 2) {
		for (int i = 0; i < gap; i++) {
			Shellinsert(vec, i, gap);
		}
	}
}
//计数排序
//时间复杂度:O(n)
//空间复杂度:O(N)
//不稳定
void Mysort::Countsort(vector<int>& vec) {
	int maxx = *max_element(vec.begin(), vec.end());
	int* countvec = new int[maxx + 1] {0};
	for (auto& i : vec) countvec[i]++;
	vec.clear();
	for (int i = 0; i < maxx+1; i++) {
		while (countvec[i] != 0) {
			countvec[i]--;
			vec.push_back(i);
		}
	}
	delete[] countvec;
}
//桶排序
//时间复杂度:O(N+C)
//空间复杂度:O(M+C)
//稳定性取决于C
void Mysort::Bucketsort(vector<int>& vec) {
	int maxx = *max_element(vec.begin(), vec.end());
	int minx = *min_element(vec.begin(), vec.end());
	int Bucketnum = (maxx - minx + 1) / vec.size() + 1; //M
	vector<vector<int>> Bucketvec(Bucketnum);
	for (auto& i : vec) {
		Bucketvec[(i - minx + 1) / Bucketnum].push_back(i);
	}
	for (auto Bucket:Bucketvec) {
		sort(Bucket.begin(), Bucket.end());   //C
	}
	vec.clear();
	for (auto Bucket:Bucketvec) {
		for (auto j :Bucket) {
			vec.push_back(j);
		}
	}
}
//构建最大堆
void Mysort::HeapMax(vector<int>& vec, int start, int end) {
	int cur = start;
	int left = 2 * cur + 1;
	while (left <= end) {
		if (left < end && vec[left] < vec[left + 1] ) left++;
		if (vec[cur] < vec[left]) swap(vec[cur], vec[left]);
		else break;
		cur = left;
		left = cur * 2 + 1;
	}
}
//堆排序
//时间复杂度:O(nlogn)
//空间复杂度:O(1)
//不稳定
void Mysort::Heapsort(vector<int>& vec) {
	for (int i = vec.size() / 2 - 1; i >= 0; i--) {
		HeapMax(vec, i, vec.size() - 1);
	}
	for (int i = vec.size() - 1; i > 0; i--) {
		swap(vec[0], vec[i]);
		HeapMax(vec, 0, i-1);
	}
}
//归并排序
//时间复杂度:O(nlogn)
//空间复杂度:O(m)
//不稳定
void Mysort::Mergedevide(vector<int>& vec, int left, int right) {
	int mid = (left + right) / 2;
	if (left >= right) return;
	Mergedevide(vec, left, mid);
	Mergedevide(vec, mid+1, right);
	Mergesort(vec, left, mid, right);

}
void Mysort::Mergesort(vector<int>& vec, int left, int mid, int right) {
	int* tmp = new int[right - left+1];
	int i = left, j = mid+1, index = 0;
	while (i <= mid && j <= right) {
		if (vec[i] < vec[j]) tmp[index++] = vec[i++];
		else tmp[index++] = vec[j++];
	}
	while (i <= mid) tmp[index++] = vec[i++];
	while (j <= right) tmp[index++] = vec[j++];
	for (int k = 0; k < index; k++) {
		vec[left + k] = tmp[k];
	}
	delete[] tmp;
}
//快速排序
//时间复杂度:O(nlogn)
//空间复杂度:O(1)
//不稳定
void Mysort::Quicksort(vector<int>& vec, int left, int right) {
	if (left >= right) return;
	int i = left, j = right, temp = vec[i];
	while (i < j) {
		while (i<j && vec[j]>temp) j--;
		if (i < j) vec[i++] = vec[j];
		while (i < j && vec[i] < temp)i++;
		if (i < j)vec[j--] = vec[i];
	}
	vec[i] = temp;
	Quicksort(vec, left, i - 1);
	Quicksort(vec, i+1, right);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值