排序,是C++各大算法当中非常常见的一个步骤(过程),通常我们使用便捷的 a l g o r i t h m algorithm algorithm头文件下的 s o r t sort sort排序。不过,随着排序的时间复杂度在题目算法中的重要性日益增强,很多排序甚至自成一种算法,别的算法需调用这个算法,而有的排序仅仅是简单的工具。不过,现在我们称每种排序均为“排序算法”。
一、概览
下面常见几种排序的概览
二、代码实现
接下来,我将展示这几种算法的实现方法(代码)
1.冒泡排序
普通版: 普通版: 普通版:
void BubbleSort(int* a, int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (a[j] > a[j + 1]) {
swap(a[j], a[j + 1]);
}
}
}
}
加强版: 加强版: 加强版:
void BubbleSort(int* a, int n) {
for (int i = 0; i < n - 1; i++) {
int flag = 1;
for (int j = 0; j < n - 1 - i; j++) {
if (a[j] > a[j + 1]) {
flag = 0;
swap(a[j], a[j + 1]);
}
}
if (flag) {
break;
}
}
}
2.插入排序
void Insert(int* a, int n)
{
for (int i = 0; i < n - 1; i++) {
int j = 0;
int tmp = a[i + 1];
for (j = i; j >= 0 && tmp < a[j]; j--) {
a[j + 1] = a[j];
}
a[j + 1] = tmp;
}
}
3.希尔排序
希尔排序其实是插入排序的进化版
void ShellSort(int* a, int n) {
int gap = n;
while (gap > 1) {
gap = gap / 3 + 1;
for (int i = 0; i < n - gap; i++) {
int end = i;
int tmp = a[end + gap];
while (end >= 0) {
if (a[end] > tmp) {
a[end + gap] = a[end];
end -= gap;
}
else {
break;
}
}
a[end + gap] = tmp;
}
}
}
4.堆排序
void AdjustDown(int*a,int root,int n) {
int parent = root;
int child = 2 * parent + 1;//向下调整算法
while (child < n) {
if (child+1<n&&a[child] < a[child + 1]) {
++child;
}
if (a[child] > a[parent]) {
swap(a[child], a[parent]);
parent = child;
child = 2 * parent + 1;
}
else {
break;
}
}
}
void HeapSort(int* a, int n) {
for (int i = (n - 2) / 2; i >= 0; i--) {
AdjustDown(a, i, n);
}
int end = n - 1;
while (end>0) {
swap(a[0], a[end]);
AdjustDown(a, 0, end);
end--;
}
}
5.选择排序
void SelectSort(int* a, int n) {
int left = 0;
int right = n - 1;
int minIndex = left, maxIndex = left;
while (left < right) {
for (int i = left; i <= right; i++) {
if (a[i] < a[minIndex]) {
minIndex = i;
}
if (a[i] > a[maxIndex]) {
maxIndex = i;
}
}
swap(a[left], a[minIndex]);
if (left == maxIndex) {
maxIndex = minIndex;
}
swap(a[right], a[maxIndex]);
left++;
right--;
}
}
6.快速排序
int GetMindIndex(int* a, int left, int right) {//三数取中
int mid = (left + right) >> 1;
if (a[left] < a[mid]) {
if (a[mid] < a[right]) {
return mid;
}
else if (a[left] > a[right]) {
return left;
}
else {
return right;
}
}
else {
if (a[mid] > a[right]) {
return mid;
}
else if (a[left] < a[right]) {
return left;
}
else {
return right;
}
}
}
、
int partition2(int* a, int left, int right) {//给你挖个坑你就往里跳法
int mid = GetMindIndex(a, left, right);
int key = a[left];
swap(key, a[mid]);
while (left < right) {
while (left < right && a[right] >= key) {
--right;
}
a[left] = a[right];
while (left < right && a[left] <= key) {
++left;
}
a[right] = a[left];
}
a[left] = key;
return left;
}
void QuickSort(int* a, int left, int right) {//正常的快速排序
if (left >= right)
return;
int mid = partition2(a, left, right);
QuickSort(a, left, mid - 1);
QuickSort(a, mid + 1, right);
}
7.归并排序
void _MerageSort(int* a, int* tmp , int left, int right) {
if (left >= right)return;
int mid = (left + right) >> 1;
_MerageSort(a,tmp, left, mid);
_MerageSort(a,tmp, mid + 1, right);
int begin1 = left;
int end1 = mid;
int begin2 = mid + 1;
int end2 = right;
int index = left;
while (begin1 <= end1 && begin2 <= end2) {
if (a[begin1] < a[begin2]) {
tmp[index++] = a[begin1++];
}
else {
tmp[index++] = a[begin2++];
}
}
while (begin1<=end1)
{
tmp[index++] = a[begin1++];
}
while (begin2 <= end2) {
tmp[index++] = a[begin2++];
}
for (int i = left; i <= right; i++) {
a[i] = tmp[i];
}
}
void MerageSort(int* a, int n) {
int* tmp = new int[n];
_MerageSort(a, tmp, 0, n - 1);
delete[] tmp;
}
三、排序时间、空间复杂度总结
声明:本图片非自行制作,参考其他博主。

5306

被折叠的 条评论
为什么被折叠?



