#include <stdio.h>
#define N 10 //测试数组长度
//交换变量值
void swap(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
//打印一次排序结果
void printResult(int a[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
//直接插入排序
void InsertSort(int L[],int length)
{
int i,j;
for(i=1;i<length;i++){
j=i;
if(L[j]<L[i-1]){
int temp=L[j];
while(temp<L[j-1]&&j!=0){
L[j]=L[j-1];
j--;
}
L[j]=temp;
}
printResult(L,length);
}
}
//冒泡排序
void BubbleSort(int L[],int length)
{
int i,j;
for(i=0;i<length-1;i++){
for(j=1;j<length;j++)
if(L[j]<L[j-1])
{
swap(L+j,L+j-1);
}
printResult(L,length);
}
}
//选择排序
void SelectSort(int L[],int length)
{
int i,j,t;
for(i=0;i<length;i++){
t=i;
for(j=i+1;j<length;j++){
if(L[j]<L[t]) t=j;
}
if(t!=i){
swap(L+i,L+t);
}
printResult(L,length);
}
}
void Shell(int L[],int d)
{
int i,j,t;
int temp;
for(i=d;i<N;i++){
if(L[i]<L[i-d]){
temp=L[i];
j=i;
while(j-d>=0&&temp<L[j-d]){
L[j]=L[j-d];
j-=d;
}
L[j]=temp;
}
printResult(L,N);
}
}
//希尔排序
void ShellSort(int L[],int d)
{
while(d>=1){
printf("d=%d\n",d);
Shell(L,d);
d/=2;
}
}
void Merge(int L[],int head,int mid,int tail)
{
int T[N]={0};
int i=0,j=mid+1,k=0;
while((head+i)<=mid&&j<=tail){
if(L[head+i]<L[j]){
T[k++]=L[head+i];
i++;
}else{
T[k++]=L[j++];
}
}
while((head+i)<=mid){
T[k++]=L[head+i];
i++;
}
while(j<=tail)T[k++]=L[j++];
for(i=0;i<k;i++)L[head+i]=T[i];
printResult(L,N);
}
//归并排序
void MergeSort(int L[],int head,int tail)
{
int mid=0;
if(head<tail){
mid=(head+tail)/2;
MergeSort(L,head,mid);
MergeSort(L,mid+1,tail);
Merge(L,head,mid,tail);
}
}
int Partition(int L[],int low,int high)
{
int pivot=L[low];
int temp;
while(low<high){
while(low<high && L[high]>=pivot){
high--;
}
swap(&L[low],&L[high]);
while(low<high && L[low]<=pivot){
low++;
}
swap(&L[low],&L[high]);
}
printResult(L,N);
return low;
}
//快速排序
void QuickSort(int L[],int low,int high)
{
if(low<high){
int head=low;
int tail=high;
int n=Partition(L,head,tail);
QuickSort(L,low,n);
QuickSort(L,n+1,high);
}
}
void HeapAdjust(int *a,int i,int size)
{
int max=i;
int lchild=2*i+1,rchild=2*i+2;
if(i<(size-1)/2){
if(lchild<size && a[lchild]>a[max]){
max=lchild;
}
if(rchild<size && a[rchild]>a[max]){
max=rchild;
}
if(i!=max){
swap(a+i,a+max);
HeapAdjust(a,max,size);
}
}
}
void BuildHeap(int *a,int size)
{
int i;
for(i=size/2-1;i>=0;i--){
HeapAdjust(a,i,size);
}
}
//堆排序
void HeapSort(int *a,int size)
{
int i;
BuildHeap(a,size);
for(i=size-1;i>=0;i--){
swap(a,a+i);
HeapAdjust(a,0,i-1);
printResult(a,size);
}
}
void main()
{
int a[10]={5,9,2,6,5,2,4,10,8,3};
//InsertSort(a,10);
//BubbleSort(a,10);
//SelectSort(a,10);
//ShellSort(a,3);
//MergeSort(a,0,9);
//QuickSort(a,0,9);
HeapSort(a,10);
}
以上列举了几种常见排序算法的实现方式,仅供参考,代码均测试无误。
常用排序算法代码测试
猜你喜欢
转载自blog.csdn.net/qinggebuyao/article/details/17245293
今日推荐
周排行