#include <iostream>
using namespace std;
// 打印数组
void printArray(int A[], int N)
{
for (int i = 0; i < N; i++) {
cout << A[i] << " ";
}
}
// 冒泡排序
void bubleSort(int A[], int N)
{
bool swapped;
for (int i = 0; i < N - 1; i++) {
swapped = false;
for (int j = 0; j < N - i - 1; j++) {
if (A[j] > A[j + 1]) {
swap(A[j], A[j + 1]);
swapped = true;
}
}
if (!swapped) {
break;
}
}
}
// 插入排序
void insertSort(int A[], int N)
{
for (int i = 1; i < N; i++) {
int val = A[i];
int j = i - 1;
for (; j >= 0 && A[j] > val; j--) {
A[j + 1] = A[j];
}
A[j + 1] = val;
}
}
// 选择排序
void selectionSort(int A[], int N)
{
for (int i = 0; i < N - 1; i++) {
int min = i;
for (int j = i + 1; j < N; j++) {
if (A[j] < A[min]) {
min = j;
}
}
swap(A[i], A[min]);
}
}
// 希尔排序
void shellSort(int A[], int N)
{
for (int increment = N / 2; increment > 0; increment /= 2) {
// 对每个子数组执行插入排序
for (int i = increment; i < N; i++) {
int tmp = A[i];
int j;
for (j = i; j >= increment && A[j - increment] > tmp; j -= increment) {
A[j] = A[j - increment];
}
A[j] = tmp;
}
}
}
// 下沉操作,用于维护堆的性质
void heapify(int arr[], int n, int i)
{
int largest = i; // 根节点
int left = 2 * i + 1;
int right = 2 * i + 2;
if (left < n && arr[left] > arr[largest]) {
largest = left;
}
if (right < n && arr[right] > arr[largest]) {
largest = right;
}
if (largest != i) {
swap(arr[i], arr[largest]);
heapify(arr, n, largest);
}
}
// 堆排序
void heapSort(int A[], int N)
{
// 构建堆,大顶堆
for (int i = N / 2 - 1; i >= 0; i--) {
heapify(A, N, i);
}
// 逐一从堆中取出最大值,将其放入已排序部分,再调整堆
for (int i = N - 1; i > 0; i--) {
swap(A[0], A[i]);
heapify(A, i, 0); // 调整堆
}
}
// 将数组分为小于基准和大于基准的两部分,返回基准的索引位置
int partion(int arr[], int left, int right)
{
int pivot = arr[right]; // 选择最后一个元素作为基准
int i = left;
int j = right - 1;
for (;; i++, j--) {
while (i <= right && arr[i] < pivot) { i++; }
while (j >= left && arr[j] > pivot) { j--; }
if (i < j) {
swap(arr[i], arr[j]);
} else {
break;
}
}
swap(arr[i], arr[right]);
return i;
}
// 快速排序
void quickSort(int A[], int left, int right)
{
if (left < right) {
// 找到基准索引的位置
int pivot = partion(A, left, right);
// 递归地对左右子数组执行快速排序
quickSort(A, left, pivot - 1);
quickSort(A, pivot + 1, right);
}
}
// 合并两个子数组
void merge(int arr[], int tmpArr[], int left, int right, int rightEnd)
{
int leftEnd = right - 1;
int tmp = left;
int num = rightEnd - left + 1;
while (left <= leftEnd && right <= rightEnd) {
if (arr[left] < arr[right]) {
tmpArr[tmp++] = arr[left++];
} else {
tmpArr[tmp++] = arr[right++];
}
}
while (left <= leftEnd) {
tmpArr[tmp++] = arr[left++];
}
while (right <= rightEnd) {
tmpArr[tmp++] = arr[right++];
}
for (int i = 0; i < num; i++, rightEnd--) {
arr[rightEnd] = tmpArr[rightEnd];
}
}
void msort(int A[], int tmpArr[], int left, int right)
{
if (left < right) {
int middle = left + (right - left) / 2;
// 递归地对左右两部分进行排序
msort(A, tmpArr, left, middle);
msort(A, tmpArr, middle + 1, right);
// 合并已排序地两部分
merge(A, tmpArr, left, middle + 1, right);
}
}
// 归并排序
void mergeSort(int A[], int N)
{
int* tmpArr = new int[N];
msort(A, tmpArr, 0, N - 1);
delete[] tmpArr;
}
int main()
{
int A[10]{ 22,1,4,18,6,51,9,7,10,3 };
printArray(A, 10);
cout << endl;
//insertSort(A, 10);
//bubleSort(A, 10);
//selectionSort(A, 10);
//shellSort(A, 10);
//heapSort(A, 10);
//quickSort(A, 0, 9);
mergeSort(A, 10);
printArray(A, 10);
cout << endl;
return 0;
}