实验六 排序
l 实验目的
1、排序的基本概念
1.掌握在数组上进行各种排序的方法和算法。
2.深刻理解各种方法的特点,并能灵活应用。
3.加深对排序的理解,逐步培养解决实际问题的编程能力。
l 实验内容
1、排序的基本概念
(一)基础题
1.编写各种排序方法的基本操作函数:
(1)s_sort(int e[],int n)选择排序;
(2)si_sort(int e[],int n)直接插入排序;
(3)sb_sort(int e[],int n)冒泡排序;
(4)merge(int e[],int n)二路合并排序。
2.调用上述函数实现下列操作:
(1)对于给定的数组E[N]={213,111,222,77,400,300,987,1024,632,555}调用选择排序函数进行排序;
(2)调用直接插入函数进行排序;
(3)调用冒泡排序函数进行排序;
(4)调用二路合并排序函数进行排序。
(二)提高题
1.编写希尔排序函数对给定的数组进行排序。
2.编写快速排序函数对给定的数组进行排序。
l 实验结果
1、排序的基本概念
(一)基础题
(1)画出数据结构基本运算的流程图
(2)程序运行主要结果截图
(3)程序源代码
#include<stdio.h> #include<conio.h> #define N 10 int E[N]={213,111,222,77,400,300,987,1024,632,555}; void s_sort(int e[],int n) { int i,j,k,t; for(i=0;i<n-1;i++) { for(k=i,j=i+1;j<n;j++) if(e[k]>e[j]) k=j; if(k!=i) { t=e[i]; e[i]=e[k]; e[k]=t; } } } int main() { int i; printf("顺序排序,初始数据序列为: "); for(i=0;i<N;i++) printf("%d ",E[i]); s_sort(E,N); printf(" 排序后的数据结构为: "); for(i=0;i<N;i++) printf("%d ",E[i]); getch(); } #include<stdio.h> #include<conio.h> #define N 10 int E[N]={213,111,222,77,400,300,987,1024,632,555}; void si_sort(int e[],int n) { int i,j,t; for(i=1;i<n;i++) { for(t=e[i],j=i-1;j>=0&&t<e[j];j--) e[j+1]=e[j]; e[j+1]=t; } } int main() { int i; printf("直接排序,初始化数据为: "); for(i=0;i<N;i++) printf("%d ",E[i]); si_sort(E,N); printf(" 排序后的数据结构为: "); for(i=0;i<N;i++) printf("%d ",E[i]); getch(); } #include<stdio.h> #include<conio.h> #define N 10 int E[N]={213,111,222,77,400,300,987,1024,632,555}; void sb_sort(int e[],int n) { int j,p,h,t; for(h=n-1;h>0;h--) { for(p=j=0;j<h;j++) if(e[j]>e[j+1]) { t=e[j]; e[j]=e[j+1]; e[j+1]=t; //p=count2; } } } int main() { int i; printf("冒泡排序,初始化数据序列为: "); for(i=0;i<N;i++) printf("%d ",E[i]); sb_sort(E,N); printf(" 排序后的数据结构序列为: "); for(i=0;i<N;i++) printf("%d ",E[i]); getch(); } #include<stdio.h> #include<conio.h> #include<malloc.h> #define N 10 int E[N]={213,111,222,77,400,300,987,1024,632,555}; void merge_step(int e[],int a[],int s,int m,int n) { int i,j,k; k=i=s; j=m+1; while(i<=m&&j<=n) if(e[i]<=e[j]) a[k++]=e[i++]; else a[k++]=e[j++]; while(i<=m) a[k++]=e[i++]; while(j<=n) a[k++]=e[j++]; } void merge_pass(int e[],int a[],int n,int len) { int f_s,s_end; f_s=0; while(f_s+len<n) { s_end=f_s+f_s+2*len-1; if(s_end>=n) s_end=n-1; merge_step(e,a,f_s,f_s+len-1,s_end); f_s=s_end+1; } if(f_s<n) for( ;f_s<n;f_s++) a[f_s]=e[f_s]; } void merge(int e[],int n) { int *p,len=1,f=0; p=(int *)malloc(n*sizeof(int)); while(len<n) { if(f==0) merge_pass(e,p,n,len); else merge_pass(p,e,n,len); len*=2; f=1-f; } if(f==1) for(f=0;f<n;f++) e[f]=p[f]; free(p); } int main() { int i; printf("归并排序,初始化数据序列为: "); for(i=000;i<N;i++) printf("%d ",E[i]); merge(E,N); printf(" 排序后的数据序列为: "); for(i=0;i<N;i++) printf("%d ",E[i]); getch(); }
(二)提高题
(1)画出数据结构基本运算的流程图
(2)程序运行主要结果截图
(3)程序源代码
#include <stdio.h> #include <stdlib.h> void ShellSort(int a[], int length) { int increment; int i,j; int temp; for(increment=length/2;increment>0;increment/=2) { for(i=increment;i<length;i++) { temp=a[i]; for(j=i-increment;j>=0&&temp<a[j];j-=increment) { a[j+increment]=a[j]; } a[j+increment]=temp; //将第一个位置填上,记录后移 } } } int main() { int i, j; int a[]={213,111,222,77,400,300,987,1024,632,555}; printf("初始化的数据序列为: "); for(i=0;i<10;i++) { printf("%d ",a[i]); } ShellSort(a,10); printf(" 排序后的序列是: "); for(j=0;j<10;j++) { printf("%d ", a[j]); } printf(" "); return 0; } #include<stdio.h> #include<stdlib.h> #define MAXNUM 10 #define keytype int typedef struct { keytype key; }datatype; datatype R[MAXNUM]; //datatype R[MAXNUM]={213,111,222,77,400,300,987,1024,632,555}; void read() { int i,n; printf("请输入要输入的个数: "); scanf("%d",&n); printf("请输入初始排序数据: "); for(i=1;i<=n;i++) { scanf("%d",&R[i]); } } int Partition(datatype R[],int low,int high) { R[0]=R[low]; while(low<high) { while(low<high&&R[high].key>=R[0].key) high--; if(low<high) { R[low]=R[high]; low++; } while(low<high&&R[low].key<R[0].key) low++; if(low<high) { R[high]=R[low]; high--; } } R[low]=R[0]; return low; } void Quick_Sort(datatype R[],int s,int t) { int i; if(s<t) { i=Partition(R,s,t); Quick_Sort(R,s,i-1); Quick_Sort(R,i+1,t); } } int main() { int i,s=1,t=10; read(); /*printf("初始化数据为: ");*/ Quick_Sort(R,s,t); printf(" 快速排序数据为: "); for(i=1;i<=MAXNUM;i++) printf("%d ",R[i]); }