6个排序算法:
插入排序:直接插入,希尔排序
交换排序:冒泡,快排序
选择排序:简单选择,堆排序
参数解释:int a[]为存放数据的数组,const int size为数字长度
#include "MyHead.h"
//直接插入排序
void InsertSort(int a[],const int size)
{
int i,j,temp;
for(i=1;i<size;++i)
{
if(a[i]<a[i-1])
{
temp=a[i];
for(j=i-1;j>=0&&temp<a[j];--j)
a[j+1]=a[j];
a[j+1]=temp;
}
}
}
//希尔排序
void ShellSort(int a[],const int size)
{
int dk,i,j,temp;
for(dk=size/2;dk>=1;dk/=2)
for(i=dk;i<size;++i)
if(a[i]<a[i-dk])
{
temp=a[i];
for(j=i-dk;j>=0&&temp<a[j];j-=dk)
a[j+dk]=a[j];
a[j+dk]=temp;
}
}
//冒泡排序,从前向后冒泡
void BubbleSort1(int a[],const int size)
{
int i,j,temp,flag;
for(i=1;i<size;++i)
{
flag=0;
for(j=0;j<size-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)
return;
}
}
//冒泡排序,从后向前冒泡
void BubbleSort2(int a[],const int size)
{
int i,j;
bool flag;
for(i=1;i<size;++i)
{
flag=false;
for(j=size-1;j>i;--j)
if(a[j]<a[j-1])
{
a[j]=a[j]^a[j-1];
a[j-1]=a[j]^a[j-1];
a[j]=a[j]^a[j-1];
flag=true;
}
if(flag==false)
return;
}
}
//快速排序
void QuickSort(int a[],int low,int high)
{
int pos;
if(low<high-1)
{
pos=Pration(a,low,high-1);
QuickSort(a,low,pos-1);
QuickSort(a,pos+1,high-1);
}
}
//快速排序划分操作
int Pration(int a[],int low,int high)
{
int pos=a[low];
while(low<high)
{
while(low<high&&a[high]>=pos) --high;
a[low]=a[high];
while(low<high&&a[low]<=pos) ++low;
a[high]=a[low];
}
a[low]=pos;
return low;
}
//直接选择排序
void SelectSort(int a[],const int size)
{
int i,j,min;
for(i=0;i<size-1;++i)
{
min=i;
for(j=i+1;j<size;++j)
if(a[j]<a[min])
min=j;
if(min!=i)
{
a[i]=a[i]^a[min];
a[min]=a[i]^a[min];
a[i]=a[i]^a[min];
}
}
}
//堆排序
void BulidMaxHeap(int a[],const int size)
{
int i;
for(i=(size-2)/2;i>=0;--i)
AdjustDown(a,i,size);
}
//从底向上调整,大根堆
void AdjustDown(int a[],int k,const int size)
{
int temp=a[k],i;
//从最后一个根节点开始调整,比较其左右子节点
for(i=2*k+1;i<size;i=2*i+1)
{
if((i+1)<size&&a[i]<a[i+1])
++i;//a[i]为左右子节点中较大的
if(a[i]<=temp) break;
else
{
a[k]=a[i];
k=i;
}
}
a[k]=temp;
}
//堆排序
void HeapSort(int a[],const int size)
{
int i;
BulidMaxHeap(a,size);
for(i=size-1;i>0;--i)
{
a[i]=a[i]^a[0];//大根堆a[0]永远为最大的
a[0]=a[i]^a[0];
a[i]=a[i]^a[0];
AdjustDown(a,0,i);
}
}
头文件:
#ifndef My_Head_H
#define My_Head_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MaxSize 10
void InsertSort(int a[],const int size);
void ShellSort(int a[],const int size);
void BubbleSort1(int a[],const int size);
void BubbleSort2(int a[],const int size);
void QuickSort(int a[],int low,int high);
int Pration(int a[],int low,int high);
void SelectSort(int a[],const int size);
void BulidMaxHeap(int a[],const int size);
void AdjustDown(int a[],int k,const int size);
void HeapSort(int a[],const int size);
int IsSameArray(int a[],int b[],int len);
#endif
IsSameArray函数:判断连个数组是否相同
#include "MyHead.h"
//比较两个长度相等的数字,相同返回0,不同返回1
int IsSameArray(int a[],int b[],int len)
{
int i=0;
while(a[i]==b[i] &&i<len)
++i;
if(i==len) return 0;
return i;
}
测试主函数:
#include "MyHead.h"
int main()
{
int i,array[MaxSize],bak1[MaxSize],bak2[MaxSize],bak3[MaxSize],bak4[MaxSize],bak5[MaxSize];
clock_t start, finish;
double duration;
srand(11100);
for(i=0;i<MaxSize;++i)
array[i]=rand();
memcpy(bak1,array,4*MaxSize);
memcpy(bak2,array,4*MaxSize);
memcpy(bak3,array,4*MaxSize);
memcpy(bak4,array,4*MaxSize);
memcpy(bak5,array,4*MaxSize);
start = clock();
InsertSort(array,MaxSize);
ShellSort(bak1,MaxSize);
BubbleSort1(bak2,MaxSize);
QuickSort(bak3,0,MaxSize-1);
SelectSort(bak4,MaxSize);
HeapSort(bak5,MaxSize);
finish = clock();
duration = finish-start;
printf("%f secs\n",duration);
printf("is same?\n%2d%2d%2d%2d%2d\n",IsSameArray(array,bak1,MaxSize),
IsSameArray(bak1,bak2,MaxSize),IsSameArray(bak2,bak3,MaxSize),
IsSameArray(bak3,bak4,MaxSize),IsSameArray(bak4,bak5,MaxSize));
for(i=0;i<MaxSize;++i)
printf("% 8d",bak5[i]);
FILE *file,*file1,*file2,*file3,*file4,*file5;
file=fopen("array.txt","w");
file1=fopen("file1.txt","w");
file2=fopen("file2.txt","w");
file3=fopen("file3.txt","w");
file4=fopen("file4.txt","w");
file5=fopen("file5.txt","w");
for(i=0;i<MaxSize;++i)
{
fprintf(file,"%8d",array[i]);
fprintf(file1,"%8d",bak1[i]);
fprintf(file2,"%8d",bak2[i]);
fprintf(file3,"%8d",bak3[i]);
fprintf(file4,"%8d",bak4[i]);
fprintf(file5,"%8d",bak5[i]);
}
fclose(file);
fclose(file1);
fclose(file2);
fclose(file3);
fclose(file4);
fclose(file5);
return 0;
}