题目
1.选择法排序。输入一个正整数n(1<n≤10),再输入n个整数,将它们从大到小排序后输出。试编写相应程序。
2.冒泡法排序。输入一个正整数n(1<n≤10),再输入n个整数,将它们从小到大排序后输出。试编写相应程序。
分析
选择排序
选择排序法的步骤如下:
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
重复第二步,直到所有元素均排序完毕。
冒泡排序
冒泡排序法的步骤如下:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
了解了原理,那么就好办了:
示例代码
选择排序,从大到小
#include <stdio.h>
void num_sort(int *ip, int n);
int main(void)
{
int n;
printf("Please enter an integer N (1-10):");
scanf("%d", &n);
if (n < 1 || n > 10) {
printf("ERROR!\n");
return -1;
}
//定义并初始化数组及其指针
int num[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int *ip = num;
//输入数据进入数组
for (int i = 0; i < n; i++) {
printf("Please enter the %dth number(0-9999):", i + 1);
scanf("%d", &num[i]);
if (num[i] < 0 || num[i] > 9999) {
printf("ERROR!\n");
return -1;
}
}
//排序
num_sort(ip, n);
//输出结果
printf("\n\n============================================\n");
printf("The sorting result is:");
for (int i = 0; i < n; i++) {
printf("%d ", num[i]);
}
printf("\n");
getchar();
return 0;
}
//选择排序:从大到小
void num_sort(int *ip, int n)
{
int temp;
for (int i = 0, max = 0; i < n; i++, max = 0) {
//取数组中的最大数
for (int j = i; j < n; j++) {
if (max < ip[j]) {
max = ip[j];
}
}
//找到最大数,并将其提前
for (int j = i; j < n; j++) {
if (max == ip[j]) {
temp = ip[i];
ip[i] = ip[j];
ip[j] = temp;
}
}
}
}
冒泡排序,从小到大
#include <stdio.h>
void num_sort(int *ip, int n);
int main(void)
{
int n;
printf("Please enter an integer N (1-10):");
scanf("%d", &n);
if (n < 1 || n > 10) {
printf("ERROR!\n");
return -1;
}
//定义并初始化数组及其指针
int num[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int *ip = num;
//输入数据进入数组
for (int i = 0; i < n; i++) {
printf("Please enter the %dth number(0-9999):", i + 1);
scanf("%d", &num[i]);
if (num[i] < 0 || num[i] > 9999) {
printf("ERROR!\n");
return -1;
}
}
//排序
num_sort(ip, n);
//输出结果
printf("\n\n============================================\n");
printf("The sorting result is:");
for (int i = 0; i < n; i++) {
printf("%d ", num[i]);
}
printf("\n");
getchar();
return 0;
}
//冒泡排序:从小到大
void num_sort(int *ip, int n)
{
int temp;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - i - 1; j++) {
//交换相邻的两个数
if (ip[j] > ip[j + 1]) {
temp = ip[j];
ip[j] = ip[j + 1];
ip[j + 1] = temp;
}
}
}
}
以上两个程序的区别仅在函数num_sort()
中