#include <vector>
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
// 冒泡排序
vector<int> bubbleSort(vector<int> arr) {
int len = arr.size();
int temp;
for(int i=0; i<len-1; i++) {
for(int j=0; j<len-i-1; j++) {
if(arr[j]>arr[j+1]) {
temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
// 选择排序
vector<int> selectSort(vector<int> arr) {
int len = arr.size();
int minIndex, temp;
for(int i=0; i<len-1; i++) {
minIndex = i;
for(int j=i+1; j<len; j++) { // 找到最小值下标
if(arr[j]<arr[minIndex]) {
minIndex = j;
}
}
temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = temp;
}
return arr;
}
// 插入排序
vector<int> insertionSort(vector<int> arr) {
int len = arr.size();
int preIndex, current;
for(int i=1; i<len; i++) {
preIndex = i-1;
current = arr[i];
while(preIndex>=0 && arr[preIndex]>current) {
arr[preIndex+1] = arr[preIndex];
preIndex--;
}
arr[preIndex+1] = current;
}
return arr;
}
// 希尔排序
vector<int> shellSort(vector<int> arr) {
int len = arr.size();
for(int gap=floor(len/2); gap>0; gap=floor(gap/2)) {
for(int i=gap; i<len; i++) {
int j=i; //当前要插入的序列
int current = arr[i];
while(j-gap >= 0 && current<arr[j-gap]) {
arr[j]=arr[j-gap];
j=j-gap;
}
arr[j]=current;
}
}
return arr;
}
// 归并排序
#include<iostream>
using namespace std;
void merge(int arr[], int L, int M, int R) {
// L是最左边序号,R是最右边序号,M是中间序号的后一位
int LEFT_SIZE = M-L;
int RIGHT_SIZE = R-M+1;
int left[LEFT_SIZE];
int right[RIGHT_SIZE];
int i, j, k;
// 1. fill in the left sub array
for(i=L; i<M; i++) {
left[i-L] = arr[i];
}
// 2. fill in the right sub array
for(i=M; i<=R; i++) {
right[i-M] = arr[i];
}
// for(auto j:left) {
// cout <<"left " << j << endl;
// }
// for(auto k:right) {
// cout << "right " << k << endl;
// }
// 3.merge into the original array
i=0; j=0; k=L;
while(i<LEFT_SIZE && j<RIGHT_SIZE) {
if(left[i] < right[j]) {
arr[k] = left[i];
i++;
k++;
}
else {
arr[k] = right[j];
j++;
k++;
}
}
while(i<LEFT_SIZE) {
arr[k] = left[i];
i++;
k++;
}
while(j<RIGHT_SIZE) {
arr[k] = right[j];
j++;
k++;
}
}
void mergeSort(int arr[], int L, int R) {
if(L==R) return; // L==R表示数组只有一位数字
int M=(L+R)/2;
mergeSort(arr, L, M);
mergeSort(arr, M+1, R);
merge(arr, L, M+1, R);
}
// 快排
#include <iostream>
using namespace std;
int partition(int a[], int low, int high) {
// i指向第一个大于pivot的值
// j指向小于等于pivot的值,如果j<pivot则开始交换
// 如果i没有找到这个值,i和j指向同一个值
int pivot=a[high];
int i=low;
for(int j=low; j<high; ++j)
{
// j指向当前遍历元素,如果大于等于pivot,继续向前
// 如果小于pivot,则和i指向的元素交换
if(a[j]<pivot) {
swap(a[j], a[i]);
i++;
}
}
swap(a[i], a[high]); // 交换到中间
return i; // 返回的是一个分区
}
void quickSort(int a[], int low, int high) {
if(low<high) {
int q = partition(a, low, high);
quickSort(a, low, q-1);
quickSort(a, q+1, high);
}
}
int main() {
// vector<int> a = {2, 3, 5, 1, 9, 7, 4};
// vector<int> b = {10, 8, 6};
// auto res = mergeSort(a);
// for (auto i:res) {
// cout << i << endl;
// }
// int arr[] = {7, 8, 9, 10, 4, 5, 6, 2};
// int L=0;
// int R=7;
// int M=4;
// int i;
// mergeSort(arr, L, R);
// for(i=0; i<R; i++) {
// cout << arr[i] << endl;
// }
int a[8] = {3, 1, 2, 4, 5, 8, 7, 6};
quickSort(a, 0, 7);
for(auto i:a)
cout << i << endl;
return 0;
}