前提:先了解冒泡排序 和 选择排序 ;
1、创建一个存放15个数字的数组;
2、给用户提示:“请输入15个数字”;(这儿我就认为用户输入的都是数字,没有其他的)
3、for循环遍历,让用户输入15次,然后把输入的数字存进数组;
4、调用你写的冒泡排序方法 和 选择排序方法 对数组排序即可。
这两个都是很基本的排序算法。书上、网上 一搜一大把。
从书上找了一个实现,你看看
#include <stdio.h>
void bubble (int a[],int n);
void selectionSort(int list [],int n);
int main(void){
int num [15] = {15,2,8,9,11,7,6,3,18,25,35,1,5,14,9};
int temp[15]; //用于测试选择排序
for(int i =0;i<15;i++){
temp[i] = num[i];
}
printf("before bubble sort:\n");
for(int i=0;i<15;i++){
printf("%d ",num[i]);
}
printf("\n\n");
bubble(num,15);
printf("after bubble sort:\n");
for(int i=0;i<15;i++){
printf("%d ",num[i]);
}
printf("\n\n");
printf("before selection sort:\n");
for(int i=0;i<15;i++){
printf("%d ",temp[i]);
}
printf("\n\n");
selectionSort(temp,15);
printf("after selection sort:\n");
for(int i=0;i<15;i++){
printf("%d ",temp[i]);
}
printf("\n\n");
return 0;
}
//冒泡排序
//算法来自 《C语言程序设计》(第3版) 何钦铭 颜晖 主编 高等教育出版社8.3 冒泡排序 8.3.1程序解析 p192页
void bubble (int a[],int n){
int i,j,t;
//从数组第2个数开始比较,直到数组最后一个数
for(i=1;i<n;i++){
//j取值从数组第一个数开始比较,最后一个数逐步从数组第二个数直到数组第一个数
//因为有a[j+1]所以,完整的比较到了数组最后一个数
for(j=0;j<n-i;j++){
//如果数组下标j位置的数大于数组下标j+1位置的数,则把他们的数值交换。
if(a[j]>a[j+1]){
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
// 选择排序
//算法参考 Java语言程序设计 基础篇 原书第8版 Y.Daniel Liang 著 李娜译 机械工业出版社
// 6.10 数组排序 6.10.1 选择排序 程序清单6-8 SelectionSort.java p176页
void selectionSort(int list[],int n){
//外层循环到数组倒数第二个,因为内层有j+1和j<n,故保证比较完了整个数组
for(int i=0;i<n-1;i++){
int currentMin = list[i]; //将数组最小值设置为当前i的值
int currentMinIndex = i; //数组最小值下标设置为i对应的数组下标
for(int j=i+1;j<n;j++){ //内层循环从i下一个值开始,直到数组最后一个值
//如果当前数组最小值大于数组位置j的值,则将数组最小值设置为数组位置j的值,
//数组最小值下标也设置为j
if(currentMin>list[j]){
currentMin = list[j];
currentMinIndex = j;
}
}
//比较完内层循环,即将数组位置i与数组其余位置的值比较之后发现最小值的下标发生了改变
//即找到了比数组位置i更小的数
//则将找到的最小值放到数组i的位置,下一个数组最小值更新为数组i当前的值,继续寻找比数组位置i更小的值
if(currentMinIndex!=i){
list[currentMinIndex] = list[i];
list[i] = currentMin;
}
}
}