实验10 排序
1、请设计直接插入排序算法函数void insertSort(int a[],int n),对a[1]…a[n]进行升序排序。并测试在不同数据规模下的排序效率。
#include "Arrayio.h"
#define N 500000
void insertSort(int a[],int n)
{
int i,j;
for (i=2;i<=n;i++)
{
a[0]=a[i];
j=i-1;
while ( a[j] > a[0])
{
a[j+1]=a[j];
j--;
}
a[j+1]=a[0];
}
}
int main()
{
int a[N+1],n;
printf("数据初始化...\n");
n=readData(a,N,"out.txt");
printf("%d个数据排序中...\n",n);
insertSort(a,n);
saveData(a,n,"out.txt");
output(a,10);
printf("排序结束,排序结果保存在out.txt文件中。\n");
return 0;
}
2、请设计二分插入排序算法函数void binInsertSort(int a[],int n),对a[1]…a[n]进行升序排序。并测试在不同数据规模下的排序效率。
#include "Arrayio.h"
#define N 50000
void binInsertSort(int a[],int n)
{
int mid,left,right,i,j;
for (i=2;i<=n;i++)
{
left=1;
right=i-1;
while (left<=right)
{
mid=(left+right)/2;
if (a[i]<a[mid])
right=mid-1;
else
left=mid+1;
}
a[0]=a[i];
for (j=i-1;j>=left;j--)
a[j+1]=a[j];
a[left]=a[0];
}
}
int main()
{
int a[N+1],n;
printf("数据初始化...\n");
n=readData(a,N,"data1.txt");
printf("%d个数据排序中...\n",n);
binInsertSort(a,n);
saveData(a,n,"out.txt");
output(a,n);
printf("排序结束,排序结果保存在out.txt文件中。\n");
return 0;
}
3、请设计shell排序算法函数void shellSort(int a[],int n),对a[1]…a[n]进行升序排序。并测试在不同数据规模下的排序效率。
#include "Arrayio.h"
#define N 500000
void shellSort(int a[],int n)
{
int i,j,d;
d=n/2;
while (d>=1)
{
for (i=d+1;i<=n;i++)
{
a[0]=a[i];
j=i-d;
while ( j>=1 &&a[j] > a[0])
{
a[j+d]=a[j];
j=j-d;
}
a[j+d]=a[0];
}
d=d/2;
}
}
int main()
{
int a[N+1],n;
printf("数据初始化...\n");
n=readData(a,N,"data1.txt");
printf("%d个数据排序中...\n",n);
shellSort(a,n);
saveData(a,n,"out.txt");
printf("排序结束,排序结果保存在out.txt文件中。\n");
return 0;
}
4、请设计简单选择排序算法函数void selectSort(int a[],int n),对a[1]…a[n]进行升序排序。并测试在不同数据规模下的排序效率。
#include "Arrayio.h"
#define N 50
void selectSort(int a[],int n)
{
int i,j,max;
for (i=1;i<n;i++)
{
max=i;
for (j=i+1;j<=n;j++)
if (a[j]>a[max])
max=j;
if (max!=i)
{
a[0]=a[i];
a[i]=a[max];
a[max]=a[0];
}
}
}
int main()
{
int a[N+1],n;
printf("数据初始化...\n");
n=readData(a,N,"data1.txt");
printf("%d个数据排序中...\n",n);
selectSort(a,n);
saveData(a,n,"out.txt");
printf("排序结束,排序结果保存在out.txt文件中。\n");
return 0;
}
5、请设计筛选函数void sift(int a[],int k,int n),对a[k] 进行筛选,并利用其设计堆排序算法函数void heapSort(int a[],int n),对a[1]…a[n]进行升序排序。并测试在不同数据规模下的排序效率。
#include "Arrayio.h"
#define N 500
void sift(int a[],int k,int n)
{
int i,j,finished;
i=k;
j=2*i;
a[0]=a[k];
finished=0;
while((j<=n)&&(!finished))
{
if((j<n)&&(a[j+1]>a[j]))
j++;
if(a[0]>=a[j])
finished=1;
else
{
a[i]=a[j];
i=j;
j=2*j;
}
}
a[i]=a[0];
}
void heapSort(int a[],int n)
{
int i;
for (i=n/2;i>=1;i--)
sift(a,i,n);
for (i=n;i>1;i--)
{
a[0]=a[i];
a[i]=a[1];
a[1]=a[0];
sift(a,1,i-1);
}
}
int main()
{
int a[N+1],n;
printf("数据初始化...\n");
n=readData(a,N,"data1.txt");
printf("%d个数据排序中...\n",n);
heapSort(a,n);
saveData(a,n,"out.txt");
printf("排序结束,排序结果保存在out.txt文件中。\n");
return 0;
}
6、请设计冒泡排序算法函数void bubbleSort(int a[],int n),对a[1]…a[n]进行升序排序。并测试在不同数据规模下的排序效率。
#include "Arrayio.h"
#define N 50
void bubbleSort(int a[],int n)
{
int i;
int flag=1;
while (n>1 && flag==1)
{ flag=0;
for (i=1;i<n;i++)
{ if (a[i]>a[i+1])
{ a[0]=a[i];
a[i]=a[i+1];
a[i+1]=a[0];
flag=1;
}
}
n--;
}
}
int main()
{
int a[N+1],n;
printf("数据初始化...\n");
n=readData(a,N,"data1.txt");
printf("%d个数据排序中...\n",n);
bubbleSort(a,n);
saveData(a,n,"out.txt");
printf("排序结束,排序结果保存在out.txt文件中。\n");
return 0;
}
7、请设计快速排序算法函数void quickSort(int a[],int low,int high),对a[low]…a[high]进行升序排序。并测试在不同数据规模下的排序效率。
#include "Arrayio.h"
#define N 500000
void quickSort(int a[],int low,int high )
{
int left,right;
if (low<high)
{
left=low;
right=high;
a[0]=a[low];
do
{
while (left<right && a[right]>a[0])
right--;
if (left<right)
a[left++]=a[right];
while (left<right &&a[left]<=a[0])
left++;
if (left<right)
a[right--]=a[left];
}while (left!=right);
a[left]=a[0];
quickSort(a,low,left-1);
quickSort(a,left+1,high);
}
}
int main()
{
int a[N+1],n;
printf("数据初始化...\n");
n=readData(a,N,"data1.txt");
printf("%d个数据排序中...\n",n);
quickSort(a,1,n);
saveData(a,n,"out.txt");
printf("排序结束,排序结果保存在out.txt文件中。\n");
return 0;
}
8、请设计归并排序算法函数void mergeSort(int a[],int n),对a[1]…a[n]进行升序排序。并测试在不同数据规模下的排序效率。
#include "Arrayio.h"
#define N 10000
void merge(int a[],int u,int m,int v)
{
int i,j,k,t;
int b[N+1];
i=u; j=m+1; k=u;
while (i<=m && j<=v)
{ if (a[i]<=b[j] )
{ b[k]=a[i];
i++;
}
else
{ b[k]=a[j];
j++;
}
k++;
}
if (i>m)
for (t=j;t<=v;t++)
b[k+t-j]=a[t];
else
for (t=i;t<=m;t++)
b[k+t-i]=a[t];
for (i=u;i<=v;i++)
a[i]=b[i];
}
int mergepass(int a[],int n,int len)
{
int i,t;
i=1;
while (i<=n-2*len+1)
{ merge(a,i,i+len-1,i+2*len-1);
i=i+2*len;
}
if (i+len-1<n)
merge(a,i,i+len-1,n);
}
void mergeSort(int a[],int n)
{ int len, b[N+1];
len=1;
while (len<n)
{ mergepass(a,n,len);
len=len*2;
}
}
void mergeSortdc(int a[],int low,int high)
{
int mid;
if (low<high)
{
mid=(low+high)/2;
mergeSortdc(a,low,mid);
mergeSortdc(a,mid+1,high);
merge(a,low,mid,high);
}
}
int main()
{
int a[N+1],n;
printf("数据初始化...\n");
n=readData(a,N,"data1.txt");
printf("%d个数据排序中...\n",n);
mergeSort(a,n);
saveData(a,n,"out.txt");
printf("排序结束,排序结果保存在out.txt文件中。\n");
return 0;
}
9、请设计基于链表的基数排序函数void radixSort(linklist head),对带头结点的整型非负单链表进行升序排序。并测试在不同数据规模下的排序效率。(注:链表中的最大整数为500000)
#include "slnklist.h"
#define N 500000
struct node2
{
linklist front,rear;
};
void radixSort(linklist head)
{
struct node2 q[10];
linklist p,r;
int i,j,k,x;
for (j=0;j<10;j++)
q[j].rear=q[j].front=NULL;
for (i=0;i<6;i++)
{
p=head->next;
while (p)
{
head->next=p->next;
x=p->info;
for (j=0;j<i;j++)
x=x/10;
k=x%10;
if (q[k].front==NULL)
{
q[k].front=q[k].rear=p;
}
else
{
q[k].rear->next=p;
q[k].rear=p;
}
p=head->next;
}
r=head;
for (j=0;j<10;j++)
{
if (q[j].front!=NULL)
{ r->next=q[j].front;
r=q[j].rear;
q[j].front=q[j].rear=NULL;
}
}
r->next=NULL;
}
}
int main()
{
linklist head;
printf("数据初始化...\n");
head=creatLink("data1.txt",N);
printf("数据排序中...\n");
radixSort(head);
writetofile(head,"out.txt");
delList(head);
return 0;
}