// MySort.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
using namespace std;
void MyPrint(int arr[], int len)
{
if (nullptr == arr)
{
return;
}
for (int i =0; i < len; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
void MySwap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
/*
* brief: 冒泡排序
* param: arr 待排序数组 len 数组长度
*/
void BubbleSort(int arr[], int len)
{
if (nullptr == arr)
{
return;
}
for (int i = 0; i < len; i++)
{
for (int j = 0; j < len - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
MySwap(arr[j], arr[j + 1]);
}
}
}
}
/*
* brief: 选择排序
* param: arr 待排序数组 len 数组长度
*/
void SelectSort(int arr[], int len)
{
if (nullptr == arr)
{
return;
}
for (int i = 0; i < len -1 ; i++)
{
for (int j = i+1; j < len; j++)
{
if (arr[i] > arr[j])
{
MySwap(arr[i], arr[j]);
}
}
}
}
/*
* brief: 插入排序
* param: arr 待排序数组 len 数组长度
*/
void InsertSort(int arr[], int len)
{
if (nullptr == arr)
{
return;
}
for (int i = 1; i < len; i++)
{
int temp = arr[i];
int j = i - 1;
for (; j >= 0 && temp < arr[j]; j--)
{
MySwap(arr[j], arr[j+1]);
}
arr[j + 1] = temp;
}
}
/*
* brief: 希尔排序
* param: arr 待排序数组 len 数组长度
*/
void ShellSort(int arr[], int len)
{
if (nullptr == arr)
{
return;
}
int increasement = len;
do {
increasement /= 3;
for (int j = increasement; j < len; j += increasement)
{
int temp = arr[j];
int k = j - increasement;
for (; k >= 0 && temp > arr[k]; k-= increasement)
{
MySwap(arr[k], arr[k + increasement]);
}
arr[k + increasement] = temp;
}
} while (increasement > 1);
}
/*
* brief: 快速排序
* param: arr 待排序数组 start 数组开始位置 end 数组结束位置
*/
void QuickSort(int arr[], int start, int end)
{
if (nullptr == arr)
{
return;
}
int i = start;
int j = end;
int temp = arr[start];
//递归结束条件
if (i >= j)
return;
while (i < j && i >= 0 && j >= 0)
{
while (i < j && arr[j] < temp)
{
j--;
}
MySwap(arr[i], arr[j]);
while (i < j && arr[i] > temp)
{
i++;
}
MySwap(arr[i], arr[j]);
}
if (i == j)
{
arr[i] = temp;
}
QuickSort(arr, start , i - 1);
QuickSort(arr, i + 1, end);
}
/*
* brief: 归并排序
* param: arr 待排序数组 start 数组开始位置 mid 数组中间位置 end 数组结束位置
*/
void Merge(int arr[], int start, int mid, int end)
{
if (nullptr == arr)
{
return;
}
int i = start;
int j = mid+1;
int len = end - start + 1;
int *temp = new int[len];
int k = 0;
while (i <= mid && j <= end)
{
if (arr[i] < arr[j])
{
temp[k] = arr[i];
i++;
k++;
}
else
{
temp[k] = arr[j];
j++;
k++;
}
}
while (i <= mid)
{
temp[k] = arr[i];
i++;
k++;
}
while (j <= end)
{
temp[k] = arr[j];
j++;
k++;
}
for (int n = 0; n < k; n++)
{
//注意arr接收的时候要用传入参数start作为下标,不能用n从0开始,因为MergeSort(arr, mid + 1, end);不是从0开始的
arr[start++] = temp[n];
}
delete []temp;
}
/*
* brief: 归并排序
* param: arr 待排序数组 start 数组开始位置 end 数组结束位置
*/
void MergeSort(int arr[], int start, int end)
{
if (nullptr == arr)
{
return;
}
//递归结束条件
if (start >= end)
return;
int mid = (start + end) / 2;
MergeSort(arr, start, mid);
MergeSort(arr, mid + 1, end);
Merge(arr, start, mid, end);
}
int main()
{
int arr[]{ 4, 6, 9, 2, 1, 8, 7, 3, 5 };
int len = sizeof(arr) / sizeof(int);
MyPrint(arr, len);
// BubbleSort(arr, len);
// MyPrint(arr, len);
// SelectSort(arr, len);
// MyPrint(arr, len);
// InsertSort(arr, len);
// MyPrint(arr, len);
// ShellSort(arr, len);
// MyPrint(arr, len);
QuickSort(arr, 0, len-1);
MyPrint(arr, len);
// MergeSort(arr, 0, len - 1);
// MyPrint(arr, len);
std::cout << "Hello Sort!\n";
}