#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int A[8] = {3,1,5,7,2,4,9,6};
int C[5]= {1,3,5,6,9};
int D[4]= {2,6,9,10};
//打印结果
void print(int A[],int n)
{
for(int i=0; i<n; i++)
printf("%d ",A[i]);
printf("\n");
}
//直接插入排序
void direct(int A[], int n)
{
for(int i= 1; i<n; i++)
{
if(A[i] < A[i-1])//若第i个元素大于i-1元素,直接插入。小于的话,移动有序表后插入
{
int j= i-1;
int x = A[i];//复制为哨兵,即存储待排序元素
A[i] = A[i-1];//先后移一个元素
while(x < A[j])//查找在有序表的插入位置
{
A[j+1] = A[j];
j--;//元素后移
}
A[j+1] = x;//插入到正确位置
}
}
printf("直接插入排序(direct)算法结果是:\n");
print(A,n); //打印每趟排序的结果
}
//插入排序_希尔排序
void shell(int A[], int n)
{
int dk = n/2;
while( dk >= 1 )
{
for(int i= dk; i<n; ++i)
{
if(A[i] < A[i-dk]) //若第i个元素大于i-1元素,直接插入。小于的话,移动有序表后插入
{
int j = i-dk;
int x = A[i]; //复制为哨兵,即存储待排序元素
A[i] = A[i-dk]; //首先后移一个元素
while(x < A[j]) //查找在有序表的插入位置
{
A[j+dk] = A[j];
j -= dk; //元素后移
}
A[j+dk] = x; //插入到正确位置
}
}
dk = dk/2;
}
printf("希尔排序(shell)算法结果是:\n");
print(A,n);
}
//冒泡排序
void bubble(int A[], int n)
{
for(int i =0 ; i< n-1; ++i)
{
for(int j = 0; j < n-i-1; ++j)
{
if(A[j] > A[j+1])
{
int tmp = A[j];
A[j] = A[j+1];
A[j+1] = tmp;
}
}
}
printf("冒泡排序(bubble)算法结果是:\n");
print(A,8);
}
//快速排序
void fast(int left, int right)
{
int i,j,t,temp;
if(left>right)
return;
temp=A[left]; //temp中存的就是基准数
i=left;
j=right;
while(i!=j)
{
//顺序很重要,要先从右边开始找
while(A[j]>=temp && i<j)
j--;
//再找右边的
while(A[i]<=temp && i<j)
i++;
//交换两个数在数组中的位置
if(i<j)
{
t=A[i];
A[i]=A[j];
A[j]=t;
}
}
//最终将基准数归位
A[left]=A[i];
A[i]=temp;
fast(left,i-1);//继续处理左边的,这里是一个递归的过程
fast(i+1,right);//继续处理右边的 ,这里是一个递归的过程
}
//简单选择排序
void choose(int A[], int n)
{
for(int i = 0; i < n-1; i++)
{
int mini = i;
for(int j = i + 1; j < n; j++)
{
if(A[j] < A[mini]) //使得min总是指向最小元素
mini = j;
}
if(mini != i) //即min有移动过
{
int temp = A[i];
A[i] = A[mini];
A[mini] = temp;
}
}
printf("简单选择排序(choose)算法结果是:\n");
print(A,8);
}
//归并排序
void Merge(int C[],int D[],int m,int n)
{
int i,j,k,E[m+n];
for(i=0,j=0,k=0; i<m&&j<n; k++)
{
if(D[j] < C[i])
{
E[k]=D[j];
j++;
}
else
{
E[k]=C[i];
i++;
}
}
while(i<m) E[k++] = C[i++];
while(j<n) E[k++] = D[j++];
printf("归并排序(merge)算法结果是:\n");
print(E,9);
}
//主程序
int main()
{
direct(A,8);
shell(A,8);
bubble(A,8);
fast(0,7);
printf("快速排序(fast)算法结果是:\n");
print(A,8);
choose(A,8);
Merge(C,D,5,4);
return 0;
}