直接插入排序
CreateData.c 创建随机数组
#include<stdlib.h>
#include<time.h>
int CreateData(int arr[],int n,int min,int max)
//创建一个随机数组,a保存胜出的数据,n为数组元素的数量
{
int i,j,flag;
srand(time(NULL));
if((max-min-1)<n) //最大数与最小数之差小于产生数组的数量,生成数据不成功
return 0;
for(i=0;i<n;i++){
do{
arr[i]=(max-min-1)*rand()/(RAND_MAX+1)+min;
flag=0;
for(j=0;j<i;j++){
if(arr[i]==arr[j])
flag=1;
}
}while(flag);
}
return 1;
}
#include<stdio.h>
#include "CreateData.c"
#define ARRAYLEN 10
void InserSort(int a[],int n)
{
int i,j,t;
for(i=1;i<n;i++){
t=a[i]; //取出一个未排序的数据
for(j=i-1;j>=0&&t<a[j];--j) //在排序序列中查找位置
a[j+1]=a[j]; //向后移动数据
a[j+1]=t; //插入数据到序列
}
}
int main()
{
int i,a[ARRAYLEN]; //定义数组
for(i=0;i<ARRAYLEN;i++)
a[i]=0;
if(!CreateData(a,ARRAYLEN,1,100)) //判断生成随机数是否成功
{
printf("生成随机数不成功!\n");
getchar();
return 1;
}
printf("原数据:"); //输出生成的随机数
for(i=0;i<ARRAYLEN;i++)
printf("%d ",a[i]);
printf("\n");
InserSort(a,ARRAYLEN); //调用插入排序函数
printf("排序后:");
for(i=0;i<ARRAYLEN;i++) //输出排序后的结果
printf("%d ",a[i]);
printf("\n");
getchar();
return 0;
}
折半插入排序
void BinSort(RecordType r[],int length)
//对记录数组r进行折半插入排序,length为数组的长度
{
for(i=2;i<length;++i)
{
x=r[i];
low=1;
high=i-1;
while(low<=high) //确定插入位置
{
mid=(low+high)/2;
if(x.key<r[mid].key)
high=mid-1;
else
low=mid+1;
}
for(j=i-1;j>=low;--j)
r[j+1]=r[j] //记录一次向后移动
r[low]=x; //插入记录
}
}
表插入排序
采用静态链表作为存储结构
typedef int KeyType;
typedef struct{
KeyType key;
OtherType other_data;
int next;
}RecordType1
算法具体描述
r[0]作为表头结点,方便插入。r[0].next指向第一个结点,r[n].next=0. 这样构成循环链表
void SLinkListSort(RecordType1 r[],int length)
{
int n=length;
r[0].next=n;
r[n].next=0;
for(i=n-1;i>=1;--i){
p=r[0].next;
q=0;
while(p>0&&r[p].key<r[i].key){ //寻找插入位置
q=p;
p=r[p].next;
}
r[q].next=i; //修改指针,插入完毕
r[i].next=p;
}
}
希尔排序
#include<stdio.h>
#include "CreateData.c"
#define ARRAYLEN 10
void ShellSort(int a[],int n)
{
int d,i,j,x;
d=n/2;
while(d>=1){ //循环至增量为1时结束
for(i=d;i<n;i++){
x=a[i]; //获取序列中的下一个数据
j=i-d; //序列中前一个数据的序号
while(j>=0&&a[j]>x){ //下一个数大于前一个数
a[j+d]=a[j]; //将后一个数向前移动
j=j-d; //修改序号,继续向前比较
}
a[j+d]=x; //保存数据
}
d/=2; //缩小增量
}
}
int main()
{
int i,a[ARRAYLEN]; //定义数组
for(i=0;i<ARRAYLEN;i++)
a[i]=0; //清空数据
if(!CreateData(a,ARRAYLEN,1,100)) //判断生成随机数是否成功
{
printf("生成随机数不成功!\n");
getchar();
return 1;
}
printf("原数据:"); //输出生成的随机数
for(i=0;i<ARRAYLEN;i++)
printf("%d ",a[i]);
printf("\n");
ShellSort(a,ARRAYLEN); //调用插入排序函数
printf("排序后:");
for(i=0;i<ARRAYLEN;i++) //输出排序后的结果
printf("%d ",a[i]);
printf("\n");
getchar();
return 0;
}
冒泡排序法
#include<stdio.h>
#include "CreateData.c"
#define ARRAYLEN 6
void BubbleSort(int a[],int n)
{
int i,j,t;
for(i=0;i<n-1;i++){
for(j=n-1;j>i;j--){
if(a[j-1]>a[j]){
t=a[j-1];
a[j-1]=a[j];
a[j]=t;
}
}
printf("第%2d遍:",i+1);
for(j=0;j<n;j++)
printf("%d ",a[j]);
printf("\n");
}
}
void BubbleSort1(int a[],int n)
{
int i,j,t,flag=0; //flag用来标记是否发生交换
for(i=0;i<n-1;i++){
for(j=n-1;j>i;j--){
if(a[j-1]>a[j]){ //交换数据
t=a[j-1];
a[j-1]=a[j];
a[j]=t;
flag=1;
}
}
printf("第%2d遍:",i+1);
for(j=0;j<n;j++)
printf("%d ",a[j]);
printf("\n");
if(flag==0) //没有发生交换,直接跳出循环
break;
else
flag=0;
}
}
int main()
{
int i,a[ARRAYLEN]; //定义数组
for(i=0;i<ARRAYLEN;i++)
a[i]=0; //清空数据
if(!CreateData(a,ARRAYLEN,1,100)) //判断生成随机数是否成功
{
printf("生成随机数不成功!\n");
getchar();
return 1;
}
printf("原数据:"); //输出生成的随机数
for(i=0;i<ARRAYLEN;i++)
printf("%d ",a[i]);
printf("\n");
BubbleSort1(a,ARRAYLEN); //调用插入排序函数
printf("排序后:");
for(i=0;i<ARRAYLEN;i++) //输出排序后的结果
printf("%d ",a[i]);
printf("\n");
getchar();
return 0;
}
快速排序
#include<stdio.h>
#include "CreateData.c"
#define ARRAYLEN 10
int Division(int a[],int left,int right) //分割
{
int base=a[left]; //基准元素
while(left<right){
while(left<right&&a[right]>base)
--right; //从右向左找第一个比基准小的元素
a[left]=a[right];
while(left<right&&a[left]<base)
++left; //从左向右找第一个比基准大的元素
a[right]=a[left];
}
a[left]=base;
return left;
}
void QuickSort(int a[],int left,int right)
{
int i;
if(left<right)
{
i=Division(a,left,right); //分割
QuickSort(a,left,i-1); //将两部分分别排序
QuickSort(a,i+1,right);
}
}
int main()
{
int i,a[ARRAYLEN]; //定义数组
for(i=0;i<ARRAYLEN;i++)
a[i]=0; //清空数据
if(!CreateData(a,ARRAYLEN,1,100)) //判断生成随机数是否成功
{
printf("生成随机数不成功!\n");
getchar();
return 1;
}
printf("原数据:"); //输出生成的随机数
for(i=0;i<ARRAYLEN;i++)
printf("%d ",a[i]);
printf("\n");
QuickSort(a,0,ARRAYLEN-1); //调用插入排序函数
printf("排序后:");
for(i=0;i<ARRAYLEN;i++) //输出排序后的结果
printf("%d ",a[i]);
printf("\n");
getchar();
return 0;
}
选择类排序
直接选择排序
#include<stdio.h>
#include "CreateData.c"
#define ARRAYLEN 10
void SlectSort(int a[],int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++){ //做第i趟排序
k=i;
for(j=i+1;j<n;j++){ //在当前区域中选key最小的记录a[k]
if(a[k]>a[j])
k=j; //k记下目前找到的最小关键字所在位置
}
t=a[i];
a[i]=a[k];
a[k]=t;
}
}
int main()
{
int i,a[ARRAYLEN]; //定义数组
for(i=0;i<ARRAYLEN;i++)
a[i]=0; //清空数据
if(!CreateData(a,ARRAYLEN,1,100)) //判断生成随机数是否成功
{
printf("生成随机数不成功!\n");
getchar();
return 1;
}
printf("原数据:"); //输出生成的随机数
for(i=0;i<ARRAYLEN;i++)
printf("%d ",a[i]);
printf("\n");
SlectSort(a,ARRAYLEN); //调用插入排序函数
printf("排序后:");
for(i=0;i<ARRAYLEN;i++) //输出排序后的结果
printf("%d ",a[i]);
printf("\n");
getchar();
return 0;
}
堆排序
HeapAdjust函数构造堆。
首先,通过循环将序号为s的结点作为根结点构成堆;
然后,判断左右子树的大小,如果右子树大于左子树则取右子树和父结点进行比较,如果父结点小于子结点,则交换父结点和子节点;
最后,通过循环将序号s作为父结点,将此节点和其子结点构成堆。、
HeapSort函数实现堆排序
首先,处理完全二叉树的非叶子结点,使无序二叉树构成一个堆;
然后,通过循环将堆中数据排序。
#include<stdio.h>
#include "CreateData.c"
#define ARRAYLEN 10
void HeapAdjust(int a[],int s,int n) //构成堆
{
int j,t;
while(2*s+1<n){ //第s个结点有右子树
j=2*s+1;
if((j+1)<n){
if(a[j]<a[j+1]){ //右左子树小于右子树,则需要比较右子树
j++; //序号增加1,指向右子树
}
}
if(a[s]<a[j]){ //比较s与j为序号的数据
t=a[s]; //交换数据
a[s]=a[j];
a[j]=t;
s=j; //堆被破坏,需要重新调整
}
else //比较左右孩子均大则未破坏,不需要重新调整
break;
}
}
void HeapSort(int a[],int n) //堆排序
{
int t,i;
for(i=n/2-1;i>=0;i--) //将a[0,n-1]建成大根堆
HeapAdjust(a,i,n);
for(i=n-1;i>0;i--){
t=a[0]; //与第一个记录交换
a[0]=a[i];
a[i]=t;
HeapAdjust(a,0,i); //将a[0]至a[i]重新调整为堆
}
}
int main()
{
int i,a[ARRAYLEN]; //定义数组
for(i=0;i<ARRAYLEN;i++)
a[i]=0; //清空数据
if(!CreateData(a,ARRAYLEN,1,100)) //判断生成随机数是否成功
{
printf("生成随机数不成功!\n");
getchar();
return 1;
}
printf("原数据:"); //输出生成的随机数
for(i=0;i<ARRAYLEN;i++)
printf("%d ",a[i]);
printf("\n");
HeapSort(a,ARRAYLEN); //调用插入排序函数
printf("排序后:");
for(i=0;i<ARRAYLEN;i++) //输出排序后的结果
printf("%d ",a[i]);
printf("\n");
getchar();
return 0;
}
归并排序
#include<stdio.h>
#define LEN 8
int a[LEN]={5,2,4,7,1,3,2,6};
void merge(int start,int mid,int end)
{
int n1=mid-start+1;
int n2=end-mid;
int left[n1],right[n2];
int i,j,k;
for(i=0;i<n1;i++) //left数组范围a[start...mid]
left[i]=a[start+i];
for(j=0;j<n2;j++) //right数组范围a[mid+1...end]
right[j]=a[mid+1+j];
i=j=0;
k=start;
while(i<n1&&j<n2){
if(left[i]<right[j])
a[k++]=left[i++];
else
a[k++]=right[j++];
}
while(i<n1) // left数组没有结束
a[k++]=left[i++];
while(j<n2) //right数组没有结束
a[k++]=right[j++];
}
void sort(int start,int end)
{
int mid;
if(start<end){
mid=(start+end)/2;
printf("sort (%d-%d,%d-%d) %d %d %d %d %d %d %d %d\n",
start,mid,mid+1,end,a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
sort(start,mid);
sort(mid+1,end);
merge(start,mid,end);
printf("merge (%d-%d,%d-%d) %d %d %d %d %d %d %d %d\n",
start,mid,mid+1,end,a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
}
}
int main()
{
sort(0,LEN-1);
getchar();
return 0;
}