#include<stdio.h>
#define ARR_SIZE 20
#include <iostream>
using namespace std;
void printArr(int arr[], int count){
for(int i = 0;i<count;i++){
printf("%d ",arr[i]);
}
printf("\n");
}
// Sort Funs
//插入排序
void InsertionSort( int arr[], size_t count )
{
if(arr == NULL || count <= 1) return;
for( int i = 1; i < count; i++ ) //从第二个元素开始
{
int tmp = arr[i],j = i;
for( ; j>0 && arr[j-1]>tmp; j-- ){
arr[j] = arr[j-1]; //挪位
}
arr[j] = tmp;
}
}
//选择排序
void SelectSort( int arr[], size_t count)
{
if(arr == NULL || count <= 1) return;
for( int i=0; i<count; i++)
{
int min = i;
for( int j=i; j<count; j++)
{
if( arr[j] < arr[min])
min = j;
}
int temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
//冒泡排序
void BubbleSort( int arr[], size_t count)
{
if(arr == NULL || count <= 1) return;
for( int i=0; i<count; i++)
{
for( int j = 1; j < count-i; j++){
if( arr[j] < arr[j-1]){
int temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
}
}
}
}
//快速排序
void QuickSort(int arr[], int left, int right)
{
if(arr == NULL || left >= right) return;
int temp = arr[left];
int i = left, j = right;
while (i < j) //若条件为i<=j,则将所有判定都加等号则会发生死循环
{
while ( i<j && arr[j] > temp ) j--;
if(i < j) arr[i++]=arr[j];
while ( i<j && arr[i] < temp ) i++;
if (i < j) arr[j--] = arr[i];
}
arr[i] = temp;
if(i-left > 1)
QuickSort(arr, left, i-1);
if(right - i > 1)
QuickSort(arr, i+1, right);
}
//计数排序
void CountingSort(int arr[], int count)
{
if(arr == NULL || count <= 1) return;
int i, min, max;
min = max = arr[0];
for(i = 1; i < count; i++) {
if (arr[i] < min)
min = arr[i];
else if (arr[i] > max)
max = arr[i];
}
int range = max - min + 1;
int *countArr = (int*)malloc(range * sizeof(int));
for(i = 0; i < range; i++)
countArr[i] = 0;
for(i = 0; i < count; i++)
countArr[ arr[i] - min ]++;
int index = 0;
for(i=0; i<range ;i++){
int sum = countArr[i];
while( sum-->0)
arr[index++]=i+min;
}
free(countArr);
}
//堆排序
#define LeftChild(i) (2*(i)+1)
void HeapAdjust( int arr[], int i, int N )
//对数组A中以下标为i的元素作为根,大小为N的元素序列构成的堆进行堆调整,使该根节点放到合适的位置
{
int Child;
int tmp;
for( tmp = arr[i]; LeftChild(i) < N; i = Child )
{
Child = LeftChild(i);
if( Child !=N-1 && arr[Child+1] > arr[ Child ] )
Child++; //使Child指向两个子女中大的那一个
if( tmp < arr[ Child ] ) //大堆
arr[i] = arr[Child];
else
break;
}
arr[i] =tmp;
}
void Heapsort( int A[], int N )
{
int i;
for( i = N/2; i >= 0; i-- ) /* BuildHeap */
HeapAdjust( A, i, N );
for( i = N-1; i > 0; i-- )
{
int temp = A[0];
A[0]=A[i];
A[i]=temp;
HeapAdjust( A, 0, i );
}
}
int main(int argc, char *argv[])
{
int arr[ARR_SIZE]={1,3,5,7,9,11,13,15,17,19,2,4,6,8,10,12,14,16,18,20};
//int arr[ARR_SIZE]={10,36,53,72,92,11,13,15,17,19,27,48,69,81,120,112,14,16,18,20};
//int arr[ARR_SIZE]={1,3,5,4,5,11,11,15,15,16,2,4,6,8,10,12,15,16,15,20};
printArr(arr,ARR_SIZE);
Heapsort(arr,ARR_SIZE);
printArr(arr,ARR_SIZE);
getchar();
}