#include <iostream>
using namespace std;
//冒泡排序
void BubbleSort(int a[], int len){
for(int i = 0; i < len; i++){
for(int j = i; j < len; j++){
if(a[i] > a[j]){
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
}
}
//选择排序,每次将最小的元素找出来放在最前面
void SelectionSort(int a[], int n){
for(int i = 0; i < n; i++){
int minn = i;
for(int j = i; j < n; j++)
if(a[j] < a[minn])
minn = j;
int tmp = a[i];
a[i] = a[minn];
a[minn] = tmp;
}
}
//插入排序,从前往后查找,每次找到逆序就把他向前移动至非逆序位置
void InsertionSort(int a[], int n){
for(int i = 1; i < n; i++){
int j = i;
int temp = a[i];
while(j > 0 && a[j-1] > temp){
a[j] = a[j-1];
j--;
}
a[j] = temp;
}
}
//希尔排序 跳跃性的插入排序
void ShellSort(int a[], int len){
int h = 1;
int tmp;
while(h < len / 3){
h = 3 * h + 1;
}
int i, j;
while(h >= 1){
for(i = h; i < len; i++){
tmp = a[i];
for(j = i; j >= h && a[j-h] > tmp; j -= h){
a[j] = a[j-h];
}
a[j] = tmp;
}
h = h / 3;
}
}
//归并排序,递归拆分成只含一个元素的子序列,逐步再合并
void MergeSort(int a[], int start, int end, int temp[]){
if(end - start > 1){ //递归结束条件
int mid = start + (end - start) / 2; //防止爆 int
int i = start, j = mid, k = start;
MergeSort(a, start, mid, temp); //归并左边
MergeSort(a, mid, end, temp); //归并右边
while(i < mid || j < end){
if(j >= end || (i < mid && a[i] <= a[j])){
temp[k++] = a[i++];
}else{
temp[k++] = a[j++];
}
}
for(i = start; i < end; i++){
a[i] = temp[i]; //从临时数组复制到原数组
}
}
}
//快速排序 每一轮后被排序的元素放在了应该在的位置
void QuickSort(int a[], int low, int high){
if(low >= high) return;
int left = low, right = high;
int key = a[left];
while(left != right){
int tmp;
while(left != right && a[right] >= key) right--;
tmp = a[right];
a[right] = a[left];
a[left] = tmp;
while(left != right && a[left] <= key) left++;
tmp = a[left];
a[left] = a[right];
a[right] = tmp;
}
QuickSort(a, low, left-1);
QuickSort(a, left+1, high);
}
int main(){
int a[10] = {2, 3, 99, 5, 7, 2, 8, 45, 77, 11};
// BubbleSort(a, 10);
// SelectionSort(a, 10);
// InsertionSort(a, 10);
// ShellSort(a, 10);
// int temp[10]; //临时数组
// MergeSort(a, 0, 9, temp);
// QuickSort(a, 0, 9);
//输出排序后的数组
for(int i = 0; i < 10; i++)
cout << a[i] << ' ';
cout << endl;
return 0;
}