排序算法小结:C++实现
标签:sort 基本 clu std 算法 bre 实现 select pre
#include
#include//排序算法的稳定性:对于相同的关键字,排序之前的位置和排序之后的位置相同,则称为稳定排序,否则不稳定排序。
//归并排序:基本思想为:先分解再合并,在合并的过程中进行排序;
//稳定排序;平均时间复杂度为:O(nlogn); 最好时间复杂度O(nlogn);最好时间复杂度O(nlogn);空间复杂度O(n);
void Meger(std::vectorint> &data, int begin, int mid,int end) {
if (begin == end) {
return;
}
int length = end - begin+1;
std::vectorint> temp(length);
int i = begin;
int j = mid+1;
int k = 0;
while (i end) {
if (data[i] data[j]) {
temp[k++] = data[i++];
}
else {
temp[k++] = data[j++];
}
}
while (i mid) {
temp[k++] = data[i++];
}
while (j end) {
temp[k++] = data[j++];
}
for (i = 0; i ) {
data[begin + i] = temp[i];
}
}
void Divide(std::vectorint> &data, int begin, int end) {
if (begin>=end) {
return;
}
int mid = (begin + end) / 2;
Divide(data, begin, mid);
Divide(data, mid+1, end);
Meger(data, begin,mid, end);
}
void Meger_Sort(std::vectorint> &data) {
if (data.empty()) {
return;
}
Divide(data, 0, data.size()-1);
for (auto each : data) {
std::cout "\n";
}
}
//Quick Sort: 找到中间分割点,根据中间分割点进行排序,再递归。
//不稳定;平均时间复杂度O(nlogn); 最好时间复杂度O(nlogn);最坏时间复杂度O(n^2);空间复杂度O(logn)
int Partition(std::vectorint> &vec, int left, int right) {
int X = vec[left];
while (left right) {
while (vec[right] > X) {
right--;
}
if (left right) {
vec[left] = vec[right];
left++;
}
while (vec[left] X) {
left++;
}
if (left right) {
vec[right] = vec[left];
right--;
}
}
vec[right] = X;
return right;
}
void Quick_Sort(std::vectorint> &vec,int left,int right) {
if (vec.empty()) {
return;
}
if (left right) {
int p = Partition(vec, left, right);
Quick_Sort(vec, left, p - 1);
Quick_Sort(vec, p + 1, right);
}
}
//选择排序
//不稳定;平均时间复杂度O(n^2); 最好时间复杂度O(n^2);最坏时间复杂度O(n^2);空间复杂度O(1)
void Select_Sort(std::vectorint> &vec) {
for (int i = 0; i 1; i++) {
int mini_index = i;
for (int j = i+1; j ) {
if (vec[j] vec[mini_index]) {
mini_index = j;
}
}
std::swap(vec[i], vec[mini_index]);
}
}
//冒泡排序
//稳定;平均时间复杂度O(n^2); 最好时间复杂度O(n);最坏时间复杂度O(n^2);空间复杂度O(1)
void Bubble_Sort(std::vectorint> &vec) {
//普通版本;
for (int i = 0; i i) {
for (int j = 1; j j) {
if (vec[j-1] > vec[j]) {
std::swap(vec[j-1], vec[j]);
}
}
}
}
void fast_Bubble_Sort(std::vectorint> &vec) {
//fast 版本;
int flag = vec.size();
int len = flag;
while (flag) {
flag = 0;
for (int i = 1; i i) {
if (vec[i - 1] > vec[i]) {
std::swap(vec[i - 1], vec[i]);
}
flag = i;
}
len = flag;
}
}
//插入排序
//稳定;平均时间复杂度O(n^2); 最好时间复杂度O(n);最坏时间复杂度O(n^2);空间复杂度O(1)
void Insert_Sort(std::vectorint> &vec) {
for (int i = 1; i i) {
int temp = vec.at(i);
int j = i - 1;
while (j >= 0&&vec.at(j) > temp) {
vec[j + 1] = vec[j];
j--;
}
vec[j+1] = temp;
}
}
//堆排序:先建立一个大根堆,然后将堆顶元素和队列尾的元素进行交换,这样就等于大元素放到队尾了每次交换,
// 需要对堆进行调整。
//不稳定;平均时间复杂度O(nlogn); 最好时间复杂度O(nlogn);最坏时间复杂度O(nlogn);空间复杂度O(1)
void adjustHeap(std::vectorint> &vec, int index,int length) {
int temp = vec[index];
//首先将该元素与其左子节点元素进行比较
for (int k = 2 * index + 1; k 2 * k + 1) {
//对左右节点进行比较,如果右节点比较大,更换成右节点
if (k + 1 1]) {
k++;
}
if (vec[k] >temp) {
vec[index] = vec[k];
index = k;
}
else
{
break;
}
}
vec[index] = temp;
}
void HeapSort(std::vectorint> &vec) {
int length = vec.size();
if (length == 0) {
return;
}
//构建最大堆;
for (int i = length / 2 - 1; i >= 0; i--) {
adjustHeap(vec, i, length);
}
//大堆顶元素逐个与末尾元素进行交换。
for (int i = length - 1; i > 0; i--) {
std::swap(vec[i], vec[0]);
adjustHeap(vec, 0,i);
}
}
//Main 函数测试部门;
int main() {
std::vectorint> vec = { 10,6,1,9,3,11,7,2,12,8,5,4,13 };
HeapSort(vec);
for (auto each : vec) {
std::cout "\n";
}
return 0;
}
排序算法小结:C++实现
标签:sort 基本 clu std 算法 bre 实现 select pre
原文地址:https://www.cnblogs.com/code-wangjun/p/9652914.html
评论