/**
需求:对于给定的一组数据进行降序排序
数据来源:随机数
算法:冒泡法,选择法……
稳定性:
复杂度:
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10//是元素个数,而不是数组下标最大值,也就是说,最大是a[N-1],没有a[N]!
int main()
{
int a[N];
int n;
int random(int [],int);
int select(int [],int);
int bubble(int [],int);
random(a,N);
printf("对此随机数序列进行降序排序:\n");
for(int j=0;j<N;j++)
printf("%4d",a[j]);
printf("\n-----------------------------\n");
printf("|--1 选择排序\n");
printf("|--2 冒泡排序\n");
printf("选择您要执行的排序算法序号\n");
scanf("%d",&n);
switch(n)
{//注意加中括号
case 1:select(a,N);break;
case 2:bubble(a,N);break;
default:return -1;
}
printf("\n");
printf("啦啦啦");
return 0;
}
int random(int a[],int n)
{//生成伪随机数_
srand(time(0));
for(int i=0;i<n;i++)
a[i]=rand()%100;
return 0;
}
int select(int a[],int n)
{ //复杂度:T(n)=(n-1)(n-2+1)/2=(n-1)^2/2=O(n^2)
//算法概述:共经历n-1趟,每趟n-i-2次交换,本轮头一个元素跟后面所有元素比较,头一个元素实时变化,
//稳定性:
int swap(int&,int&);
int tmp=0;//用于交换的临时变量
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)//j最大取n-1,i最大取n-2
{//第I轮把最大的放在最前
if(a[j]>a[i])
{
/* tmp=a[i];
a[i]=a[j];
a[j]=tmp;
*/
swap(a[i],a[j]);
}
}
}
printf("\n");
printf("选择排序后:\n");
for(int k=0;k<N;k++)
printf("%4d",a[k]);
printf("\n");
return 0;
}
int bubble(int a[],int n)//再次提醒!:n是元素个数,而不是最大下标!
{//算法概述:共n-1趟,相邻两个交换,每趟交换次数比上一趟少1
//复杂度:T(n)=(n-1)*(n-1+1)/2=n*(n-1)^2/2=O(n^2)
//稳定性:
int swap(int&,int&);
int tmp=0;
for(int i=0;i<n-1;i++)//轮数
{
for(int j=0;j<n-i-1;j++)
{//每趟交换次数比第一次少(i+1)次,比如3个数,第一次交换2次就行了
if(a[j+1]>a[j])
{//使相邻的两元素,左边的比右边的大
/* tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
*/
swap(a[j],a[j+1]);
}
}
}
printf("冒泡排序后:\n");
for(int k=0;k<n;k++)
printf(" %d ",a[k]);
printf("\n");
return 0;
}
int swap(int &a,int &b)
{
int tmp;
tmp=a;
a=b;
b=tmp;
return 0;
}
如题