#include<iostream>
using namespace std ;
//num[0]作为哨兵,不使用,数组从1开始
//插入排序
void InsertSort(int num[], int n)
{
int j;
for(int i = 2 ; i <= n ; i++)
{
if(num[i] < num[i - 1])
{
num[0] = num[i];
for(j = i - 1 ; num[j] > num[0] ; j--)
{
num[j + 1] = num[j];
}
num[j + 1] = num[0];
}
}
}
//冒泡排序
void BubbleSort(int num[], int n)
{
bool flags;
for(int i = n ; i > 1 ; i--)
{
flags = false;
for(int j = 1 ; j < i ; j++)
{
if(num[j] > num[j + 1])
{
swap(num[j], num[j + 1]);
flags = true;
}
}
if(!flags) return;
}
}
//希尔排序
void ShellSort(int num[], int n)
{
int j;
for(int len = n / 2 ; len >= 1 ; len /= 2)
{
for(int st = len + 1 ; st <= n ; st += len)
{
if(num[st] < num[st - len])
{
num[0] = num[st];
for(j = st - len ; j >= 1 && num[j] > num[0] ; j -= len)
{
num[j + len] = num[j];
}
num[j + len] = num[0];
}
}
}
}
//快速排序
int Partion(int num[], int s, int e)
{
int c = s;
s ++;
while(true)
{
while(e >= s && num[c] > num[s]) s++;
while(e >= s && num[c] < num[e]) e--;
if(e < s) break;
swap(num[s++], num[e--]);
}
swap(num[c], num[e]);
return e;
}
void QuickSort(int num[], int s, int e)
{
if(e <= s) return;
int mid = Partion(num, s, e);
QuickSort(num, s, mid - 1);
QuickSort(num, mid + 1, e);
}
//堆排序
void CereatHeap(int num[], int n)
{
int tmp =0;
int p = 0;
for(int i= n/2;i>=1;i--)
{
p = i;
while(p * 2 <= n)
{
tmp = p * 2;
if(tmp + 1 <= n && num[tmp + 1] > num[tmp]) tmp += 1;
if(num[tmp] > num[p])
{
swap(num[p], num[tmp]);
p = tmp;
}
else
{
break;
}
}
}
}
void adjustHeap(int num[], int n)
{
int p = 1;
int tmp = 0;
while(p * 2 <= n)
{
tmp = p * 2;
if(tmp + 1 <= n && num[tmp + 1] > num[tmp]) tmp += 1;
if(num[tmp] > num[p])
{
swap(num[p], num[tmp]);
p = tmp;
}
else
{
break;
}
}
}
void HeapSort(int num[], int n)
{
for(int i=n;i>=2;i--)
{
swap(num[1], num[i]);
adjustHeap(num, i - 1);
}
}
//归并排序
int helpNum[1000];
void merge(int num[], int low,int mid, int high)
{
for(int i = low;i<=high;i++)
helpNum[i] = num[i];
int k=low;
int i =low;
int j = mid + 1;
for( ;i<=mid&&j<=high;)
{
if(helpNum[i] < helpNum[j])
{
num[k++]= helpNum[i++];
}
else
{
num[k++]= helpNum[j++];
}
}
while(i <= mid) num[k++] = helpNum[i++];
while(j <= high) num[k++] = helpNum[j++];
}
void MergerSort(int num[], int low, int high)
{
if(low < high)
{
int mid = (low + high) / 2;
MergerSort(num, low, mid);
MergerSort(num, mid + 1, high);
merge(num, low, mid, high);
}
}
//归并排序
int main()
{
int num[] = {
-10000, 1, 4, 3, 2, 1, 5
};
int n =6;
InsertSort(num, n);//插入排序
BubbleSort(num, n);//冒泡排序
ShellSort(num, n);//希尔排序
QuickSort(num, 1, n);//快速排序
HeapSort(num, n);//堆排序
MergerSort(num, 1, n);//归并排序
return 0 ;
}