求数据结构课程设计(C语言)—排序综合!利用随机函数产生N个随机整数(2万以上),至少使用三种方法实现

提示,可采用的方法有插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序

第1个回答  推荐于2018-04-09
冒泡法
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 10000
void init_array(int a[N],int n)
{
int i;
srand(time(NULL));
for(i=0;i<n;i++){
a[i]=rand()%N;
}
}
void sort(int a[N],int n)
{
int i,j;
int t;
for(i=0;i<n;i++){//这个循环说明要循环N次 每循环一个把最大的放最后
for(j=0;j<n-1-i;j++){//这里的循环时把相邻的2数比较 交换 交换到承认后面的数最大
if(a[j]>a[j+1]){
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
void display(int a[N],int n)
{
int i;
for(i=0;i<n;i++){
printf("%d\n",a[i]);
}
}
int main()
{
int array[N];
init_array(array,N);
sort(array,N);
display(array,N);
return 0;
}

快速排序
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 100240
int small_array[N];
int big_array[N];
void my_list(int a[],int n)
{
int i;
srand(time(NULL));
for(i=0;i<n;i++)
a[i]=rand()%n;
}
int my_quick(int a[],int start,int end)
{
int i,eq;
int small_count=0,big_count=0;
eq=a[start];
if(start>=end) return;
for(i=start+1;i<=end;i++){
if(a[i]<eq){
small_array[small_count]=a[i];
small_count++;
}
else{
big_array[big_count]=a[i];
big_count++;
}
}
for(i=0;i<small_count;i++)
a[start+i]=small_array[i];
a[start+small_count]=eq;
for(i=0;i<big_count;i++)
a[start+i+small_count+1]=big_array[i];
my_quick(a,start,start+small_count-1);
my_quick(a,start+small_count+1,end);

}
void display(int a[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%d\n",a[i]);
}
int main()
{
int array[N];
my_list(array,N);
my_quick(array,0,N-1);
display(array,N);
}

归并排序
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 100240
void inti_list(int array[N],int n)
{
int i;
srand(time(NULL));
for(i=0;i<n;i++){
array[i]=rand()%N;
}
}
void merge(int a[N],int l_start,int l_end,int r_end)
{
int i;
int n=l_start;
int temp[N];
int r_start=l_end+1;
int m=r_start;
for(i=n;i<=r_end;i++){
if(n<=l_end&&m<=r_end){
if(a[n]<a[m]){
temp[i]=a[n];
n++;
}
else{
temp[i]=a[m];
m++;
}
}
else{
if(n>l_end){
temp[i]=a[m];
m++;
}
else if(m>r_end){
temp[i]=a[n];
n++;
}
}

}
for(i=l_start;i<=r_end;i++){
a[i]=temp[i];
}
}
int msort(int a[N],int start,int end)
{
if(start==end) return 0;
msort(a,start,(start+end)/2);
msort(a,(start+end)/2+1,end);
merge(a,start,(start+end)/2,end);
}
void display(int a[N],int n)
{
int i;
for(i=0;i<n;i++){
printf("%d\n",a[i]);
}
}
int main()
{
int array[N];
inti_list(array,N);
msort(array,0,N-1);
display(array,N);
return 0;
}
选择排序

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 10240
void inti_list(int array[],int n)
{
int i;
srand(time(0));
for(i=0;i<n;i++){
array[i]=rand()%100000;
}
}
void buuble(int array[],int n)
{
int i,j,k,t,min;
for(i=0;i<n;i++){
min=array[i];
for(j=i+1;j<n;j++){
if(array[j]<min){
min=array[j];
k=j;
}
}
t=array[k];
array[k]=array[i];
array[i]=t;

}
}
void display(int array[],int n)
{
int i;
for(i=0;i<n;i++){
printf("%d\n",array[i]);
}

}
int main()
{
int n=N;
int array[N];
inti_list(array,n);
buuble(array,n);
display(array,n);
return 0;
}

堆排序

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 10240
void heap_sort(int a[],int i)
{
int t;
if(i==1) return;
if(a[i]<a[i/2]){
t=a[i];
a[i]=a[i/2];
a[i/2]=t;
heap_sort(a,i/2);
}
else{
return;
}
}
void init_array(int a[],int n)
{
int i;
srand(time(NULL));
for(i=1;i<=n;i++){
a[i]=rand()%N;
}
}
void init_sort(int a[],int n)
{
int i;
for(i=1;i<=n;i++)
heap_sort(a,i);
}
void display(int a[],int n)
{
int i;
for(i=n;i>=1;i--)
printf("%d\n",a[i]);
}
void h_sort(int a[],int i,int j,int k,int n)
{
int t;
if(n<j) return;
if(n<k&&n==j){
if(a[j]>=a[i]) return;
if(a[j]<a[i]){
t=a[j];
a[j]=a[i];
a[i]=t;
return;
}
}
if(a[i]<=a[k]&&a[i]<=a[j]) return;
else{
if(a[j]<=a[k]){
t=a[j];
a[j]=a[i];
a[i]=t;
h_sort(a,j,2*j,2*j+1,n);
}
else if(a[j]>a[k]){
t=a[k];
a[k]=a[i];
a[i]=t;
h_sort(a,k,2*k,2*k+1,n);
}
}
}
void heapsort(int a[],int n)
{
int t;
t=a[n];
a[n]=a[1];
a[1]=t;
h_sort(a,1,2,3,n-1);
return;
}
int main()
{
int i;
int array[N+1];
init_array(array,N);
init_sort(array,N);
for(i=N;i>=1;i--){
heapsort(array,i);
}
display(array,N);
return 0;
}

够了吧 记得给我加分 还给你运行过了本回答被网友采纳
第2个回答  2011-06-25
给你发了 不只3种 给你5种了 363173922的 记得给我加分 有问题加我再给你解决 没分就免谈 好了都给你搞定了