/* Note:Your choice is C IDE */
#include "stdio.h"
#include "stdlib.h"
/********************插入排序********************/
void Insert_sort(int a[], int n) { //直接插入排序
int i,j;
int temp = 0;
for(i = 1; i < n; i++) {
temp = a[i];
for(j = i; j > 0 && a[j-1] > temp; j--) {
a[j] = a[j-1];
}
a[j] = temp;
}
for(i = 0; i < n-1; i++) {
printf("%d ",a[i]);
}
printf("%d\n",a[i]);
}
void Shell_sort(int a[], int n) { //希尔排序
int i,j,d;
int temp = 0;
for(d = n/2; d >= 1; d /= 2) {
for(i = d; i < n; i++) {
temp = a[i];
for(j = i; j >= d && a[j-d] > temp; j=j-d) {
a[j] = a[j-d];
}
a[j] = temp;
}
}
for(i = 0; i < n-1; i++) {
printf("%d ",a[i]);
}
printf("%d\n",a[i]);
}
/********************选择排序********************/
void Selete_sort(int a[], int n) { //直接选择排序
int i,j;
int temp = 0;
int min,min_number;
for(i = 0; i < n; i++) {
min = a[i];
min_number = i;
for(j = i; j < n; j++) {
if(a[j] < min) {
min = a[j];
min_number = j;
}
}
temp = a[i];
a[i] = a[min_number];
a[min_number] = temp;
}
for(i = 0; i < n-1; i++) {
printf("%d ",a[i]);
}
printf("%d\n",a[i]);
}
void MaxHeap(int a[],int p,int n) { //堆排序
int Parent,Child; //最大堆建立
int temp = a[p];
for(Parent = p; (Parent * 2 + 1) < n; Parent = Child) {
Child = Parent * 2 + 1;
if((Child != n - 1) && (a[Child] < a[Child + 1])) {
Child++;
}
if(temp >= a[Child]) break;
else
a[Parent] = a[Child];
}
a[Parent] = temp;
}
void HeapSort(int a[],int n) { //最大堆排序
int i,temp;
for(i = n/2; i >= 0; i--) {
MaxHeap(a,i,n);
}
for(i = n-1; i > 0; i--) {
temp = a[0];
a[0] = a[i];
a[i] = temp;
MaxHeap(a,0,i);
}
for(i = 0; i < n-1; i++) {
printf("%d ",a[i]);
}
printf("%d\n",a[i]);
}
/********************交换排序********************/
void Bubble_sort(int a[], int n) { //冒泡排序
int i,j;
int flag = 0;
int temp = 0;
for(i = n-1; i >= 0; i--) {
flag = 0;
for(j = 0; j < i; j++) {
if(a[j]>a[j+1]) {
temp = a[j];
a[j] = a[j+1];
a[j+1] =temp;
flag = 1;
}
}
if(flag == 0) break;
}
for(i = 0; i < n-1; i++) {
printf("%d ",a[i]);
}
printf("%d\n",a[i]);
}
void Qsort_divide(int a[],int left,int right) { //快速排序
int i = left, j = right;
int temp = a[i];
if(left < right) {
while(i < j) {
while((i < j) && (a[j] > temp)) j--; //右边往左边走
if(i < j) a[i++] = a[j];
while((i < j) && (a[i] < temp)) i++; //左边往右边走
if(i < j) a[j--] = a[i];
}
a[i] = temp;
Qsort_divide(a,left,i-1);
Qsort_divide(a,i+1,right);
}
}
void Quick_Sort(int a[], int N) {
int i = 0;
Qsort_divide(a,0,N-1);
for(i = 0; i < N-1; i++) {
printf("%d ",a[i]);
}
printf("%d\n",a[i]);
}
int main()
{
int arr[20] = {17,3,8,10,15,21,12,7,13,4,9,16,11,5,6,1,2,14,19,18};
Insert_sort(arr,20); //直接插入排序
Shell_sort(arr,20); //希尔排序
Selete_sort(arr,20); //直接选择排序
HeapSort(arr,20); //堆排序
Bubble_sort(arr,20); //冒泡排序
Quick_Sort(arr,20); //快速排序
return 0;
}