【C语言-选择排序算法】实现对十个数进行排序
目录
前言
一、选择排序算法原理
二、选择排序算法实现对十个数进行排序
三、代码运行示例
四、选择排序算法的时间复杂度和空间复杂度分析
五、选择排序算法的优缺点
六、总结
前言
在计算机科学领域,排序算法是基石般的存在,它们就像是整理杂乱数据的魔法,让无序的数据变得井井有条。而选择排序(Selection Sort),作为一种简单直观的排序算法,在学习排序的道路上是我们绕不开的经典算法之一。今天,我们一起探讨如何使用 C 语言实现选择排序算法,对十个数字进行排序,并详细剖析其中的原理与细节。
一、选择排序算法原理
选择排序的核心思想可以用 “挑最小的放前面” 来概括。它的执行过程就像是在一群学生中,先找出最矮的学生站到队伍最前面,然后在剩下的学生中再找出最矮的,依次类推,直到整个队伍按照身高从矮到高排列整齐。
具体到数字排序上,在一个包含 n 个元素的数组中,选择排序会在每一轮遍历中,从待排序的元素中找出最小(或最大)的元素,将其与待排序序列的起始位置元素交换位置。每完成一轮遍历,就会有一个元素被放置到它最终的正确位置上,经过 n - 1 轮遍历后,整个数组就完成了排序。
例如,对于数组[5, 3, 8, 6, 7],第一轮遍历会找出最小的元素3,将其与数组第一个元素5交换位置,得到[3, 5, 8, 6, 7];第二轮在剩余的[5, 8, 6, 7]中找出最小的5,由于它已经在正确位置,无需交换;第三轮在[8, 6, 7]中找出最小的6,与8交换,得到[3, 5, 6, 8, 7];第四轮在[8, 7]中找出最小的7,与8交换,最终得到有序数组[3, 5, 6, 7, 8] 。
二、选择排序算法实现对十个数进行排序
在 C 语言中,我们可以通过以下代码实现选择排序算法对十个数字进行排序:
#include <stdio.h>// 选择排序函数
void selectionSort(int arr[], int n) {int i, j, min_index, temp;for (i = 0; i < n - 1; i++) {min_index = i;for (j = i + 1; j < n; j++) {if (arr[j] < arr[min_index]) {min_index = j;}}// 交换找到的最小元素和当前位置元素temp = arr[min_index];arr[min_index] = arr[i];arr[i] = temp;}
}int main() {int numbers[10];printf("请输入十个整数:\n");for (int i = 0; i < 10; i++) {scanf("%d", &numbers[i]);}selectionSort(numbers, 10);printf("排序后的结果为:\n");for (int i = 0; i < 10; i++) {printf("%d ", numbers[i]);}printf("\n");return 0;
}
代码详解:
选择排序函数selectionSort:
void selectionSort(int arr[], int n) {int i, j, min_index, temp;for (i = 0; i < n - 1; i++) {min_index = i;for (j = i + 1; j < n; j++) {if (arr[j] < arr[min_index]) {min_index = j;}}// 交换找到的最小元素和当前位置元素temp = arr[min_index];arr[min_index] = arr[i];arr[i] = temp;}
}
- 函数参数:arr是要排序的数组,n是数组的元素个数。
- 外层循环:for (i = 0; i < n - 1; i++),控制排序的轮数。因为经过n - 1轮,就可以将n个元素全部放置到正确位置,所以循环次数为n - 1。
- 内层循环:for (j = i + 1; j < n; j++),用于在每一轮中从 i + 1 位置开始遍历数组,找出剩余元素中的最小元素的下标,并将其存储在min_index中。在遍历过程中,通过 if (arr[j] < arr[min_index]) 比较元素大小,如果找到比当前最小元素更小的元素,就更新min_index。
- 交换操作:找到最小元素的下标min_index后,通过中间变量temp将最小元素与当前位置(i位置)的元素进行交换,即:
temp = arr[min_index];
arr[min_index] = arr[i];
arr[i] = temp;
这样就将当前轮找到的最小元素放置到了它应该在的位置上。
主函数main:
int main() {int numbers[10];printf("请输入十个整数:\n");for (int i = 0; i < 10; i++) {scanf("%d", &numbers[i]);}selectionSort(numbers, 10);printf("排序后的结果为:\n");for (int i = 0; i < 10; i++) {printf("%d ", numbers[i]);}printf("\n");return 0;
}
- 首先定义一个长度为 10 的整型数组numbers,用于存储用户输入的十个数字。
- 通过for循环和scanf函数,提示用户输入十个整数,并将输入的数字依次存储到数组numbers中。
- 调用selectionSort函数对numbers数组进行排序,传入数组名和数组元素个数 10。
- 最后再通过一个for循环和printf函数,将排序后的数组元素依次输出,展示排序结果。
三、代码运行示例
假设我们输入十个数字:9 5 2 7 1 8 3 6 4 0,程序运行后,会输出排序后的结果:0 1 2 3 4 5 6 7 8 9 。每一个数字都按照从小到大的顺序被正确排列,这正是选择排序算法发挥作用的结果。
四、选择排序算法的时间复杂度和空间复杂度分析
时间复杂度:
选择排序的时间复杂度主要取决于两层嵌套循环。外层循环执行 n - 1 次,内层循环在第i次外层循环时执行 n - i 次。总的比较次数为(n - 1) + (n - 2) +... + 1 = n * (n - 1) / 2,所以选择排序的时间复杂度为O(n^2),其中n是数组元素的个数。这意味着,随着数组规模的增大,选择排序所需的时间会呈平方级增长,在处理大规模数据时效率较低。
空间复杂度:
在选择排序过程中,除了原数组外,只使用了几个额外的变量(如min_index、temp等)来辅助排序,这些变量所占用的空间是固定的,不随数组规模的变化而变化。因此,选择排序的空间复杂度为O(1),属于原地排序算法,不需要额外开辟大量的内存空间。
五、选择排序算法的优缺点
优点:
- 简单直观:选择排序的原理和实现都非常简单,对于初学者来说,很容易理解和掌握,是学习排序算法的良好入门选择。
- 稳定且原地排序:在不考虑相等元素交换的情况下,选择排序是一种稳定的排序算法(如果在比较时遇到相等元素不交换位置,就能保证相等元素的相对顺序不变)。并且它不需要额外的大量内存空间,只需要几个辅助变量,空间复杂度低,适合在内存资源有限的环境下使用。
缺点:
- 效率较低:由于其时间复杂度为O(n^2),在处理大规模数据时,排序所需的时间会急剧增加,相比一些高效的排序算法(如快速排序、归并排序等),性能较差。
- 交换次数较多:在选择排序过程中,即使数据已经部分有序,它仍然会按照固定的方式进行比较和交换操作,没有利用数据已有的有序性,这也是导致其效率低下的一个原因。
六、总结
通过以上详细的讲解和代码实现,我们深入了解了选择排序算法,并成功使用 C 语言对十个数字进行了排序。选择排序虽然在处理大规模数据时效率不高,但它简单易懂的特性使其成为学习排序算法的重要基础。同时,通过对选择排序的学习,我们也对 C 语言数组的操作、循环结构以及函数的使用有了更深入的理解。在实际编程中,我们可以根据具体的数据规模和需求,选择合适的排序算法来提高程序的性能和效率。希望本文能帮助大家更好地掌握选择排序算法。
如果你对选择排序算法还有其他疑问或文章中有不对的地方,欢迎交流指正!