一、逆序打印出十个数
此处选择的是使用选择排序的方法,选择排序是一种灵巧的算法,但其速度不是很快。快速排序是一种更快的排序算法,其运行时间为 𝑂(𝑛𝑙𝑜𝑔𝑛),各位有时间可以尝试一下此种方法。
选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理是:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
选择排序的步骤:
- 在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
- 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
- 重复第二步,直到所有元素均排序完毕。
选择排序的时间复杂度:
- 最好情况:时间复杂度为 O(n2)。
- 最坏情况:时间复杂度为 O(n2)。
- 平均情况:时间复杂度为 O(n2)。
代码如下:
#include <stdio.h>
void selection_sort(int arr[], int n) {
int i, j, max_idx;
for(i=0;i<n-1;i++)
{
max_idx=i;
for(j=i+1;j<10;j++)
{
if(arr[j]>arr[max_idx])
{
max_idx=j;
}
}
int temp=arr[i];
arr[i]=arr[max_idx];
arr[max_idx]=temp;
}
}
int main() {
int i;
int numbers[10] = {0};
for(i=0;i<10;i++)
{
scanf("%d",&numbers[i]);
}
int n = sizeof(numbers)/sizeof(numbers[0]);
selection_sort(numbers, n);
printf("逆序打印十个数(从大到小):");
for (i = 0; i < n; i++) {
printf("%d ", numbers[i]);
}
return 0;
}
测试用例:10 12 3 5 6 9 21 30 15 17
运行结果:
二、有10个地区的面积,要求对他们按照从小到大的顺序排列(冒泡排序)
冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
冒泡排序算法的运作如下:
- 比较相邻的元素。如果第一个比第二个大(升序排序),就交换它们两个;
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数;
- 针对所有的元素重复以上的步骤,除了最后一个;
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
冒泡排序的平均时间复杂度和最坏时间复杂度都是O(n^2),其中n是数组的长度。尽管它不是最高效的排序算法,但由于其实现简单,因此在教学中经常被使用。
代码如下:
#include <stdio.h>
void bubble_sort(int arr[], int n) {
int i, j;
for(i=0;i<n;i++)
{
for(j=0;j<n-i-1;j++)
{
if(arr[j]>arr[j+1])
{
int temp;
temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
}
}
}
int main() {
int i;
int numbers[10] = {0};
for(i=0;i<10;i++)
{
scanf("%d",&numbers[i]);
}
int n = sizeof(numbers)/sizeof(numbers[0]);
bubble_sort(numbers, n);
printf("从小到大的顺序排列:");
for (i = 0; i < n; i++) {
printf("%d ", numbers[i]);
}
return 0;
}
测试用例:1400 9876 435 3587 4728 4587 2942 3854 6564 8768
运行结果:
三、将一个二维数组行和列的元素互换,存到另一个数组中
提示:将数组a的元素赋值给数组b的对应位置(行列互换),b[j][i]=a[i][j]
#include<stdio.h>
int main()
{
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int b[4][3],i,j;
printf("before:");
printf("\n");
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("%5d",a[i][j]);
b[j][i]=a[i][j];
}
printf("\n");
}
printf("after:");
printf("\n");
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
{
printf("%5d",b[i][j]);
}
printf("\n");
}
return 0;
}
运行结果: