首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

c语言选择排序法

选择排序(Selection Sort)是一种简单直观的排序算法。它的基本思想是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

基本概念

  1. 初始状态:将整个序列分为已排序和未排序两部分,开始时已排序部分为空,未排序部分为整个序列。
  2. 选择最小元素:在未排序部分中找到最小(或最大)的元素。
  3. 交换位置:将找到的最小(或最大)元素与未排序部分的第一个元素交换位置。
  4. 重复步骤:重复上述步骤,直到未排序部分只剩下一个元素。

优势

  • 实现简单,易于理解和编写。
  • 不需要额外的存储空间,是原地排序算法。

类型

选择排序是一种不稳定的排序算法,因为相同元素的相对位置可能会改变。

应用场景

选择排序适用于数据量较小的情况,因为它的时间复杂度较高,不适合大规模数据的排序。

示例代码(C语言)

代码语言:txt
复制
#include <stdio.h>

void selectionSort(int arr[], int n) {
    int i, j, min_idx, temp;

    // 一次遍历所有数组元素
    for (i = 0; i < n-1; i++) {
        // 找到未排序部分的最小元素
        min_idx = i;
        for (j = i+1; j < n; j++)
            if (arr[j] < arr[min_idx])
                min_idx = j;

        // 将找到的最小元素与未排序部分的第一个元素交换
        temp = arr[min_idx];
        arr[min_idx] = arr[i];
        arr[i] = temp;
    }
}

void printArray(int arr[], int size) {
    int i;
    for (i=0; i < size; i++)
        printf("%d ", arr[i]);
    printf("\n");
}

int main() {
    int arr[] = {64, 25, 12, 22, 11};
    int n = sizeof(arr)/sizeof(arr[0]);
    selectionSort(arr, n);
    printf("Sorted array: \n");
    printArray(arr, n);
    return 0;
}

可能遇到的问题及解决方法

  1. 时间复杂度高:选择排序的时间复杂度为O(n^2),对于大规模数据不适用。可以考虑使用更高效的排序算法,如快速排序、归并排序等。
  2. 稳定性问题:选择排序是不稳定的排序算法。如果需要稳定性,可以考虑使用插入排序或归并排序。

总结

选择排序是一种简单但效率较低的排序算法,适用于小规模数据的排序。了解其基本原理和实现方法对于初学者理解排序算法有很大帮助。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C语言选择法与冒泡法排序

C语言学习过程中遇到的各类麻烦,写篇C语言排序的文章,用我自己的方式讲述,帮助不能理解的朋友理解,顺便得到一些反馈帮助我自己 ?...C语言的排序法有很多种,目前我只学到了选择法和冒泡法,这两种排序主要考察的就是for循环的嵌套循环和数组,里面还涉及一个交换算法,本文的顺序是 交换算法,选择法排序,冒泡法排序 交换算法 交换算法是一个非常常见的算法...选择法排序 选择法排序也是一种很简单的排序,只不过要用for的嵌套循环和条件语句 算法内容: #include int main(void){ int i,j; //定义循环变量...,内层循环的j=i+1是为了不让a[i]和本身比较而浪费时间,选择排序法是每个元素都要和比自己大的元素进行一次比较。...一趟趟的冒泡,排序也就完成了 怎么说呢,冒泡法排序就像打地鼠一样,第一遍把最大的地鼠打到最后,然后第二遍把第二大的地鼠打到最后,依次类推。

2.5K20
  • C语言冒泡法排序

    冒泡排序的原理是:从左到右,相邻元素进行比较。通过for循环每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。...以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。...比如对下面这个序列进行从小到大排序: 80  21  156  -90  65 第一轮: 1) 80 和 21比,80>21,则它们互换位置: 21  80  156  -90  65 2) 80 和...至此,整个序列排序完毕。从小到大的序列就是“–90 21 65 80 156”。从这个例子中还可以总结出,如果有 n 个数据,那么只需要比较 n–1 轮。而且除了第一轮之外,每轮都不用全部比较。

    2.8K90

    冒泡排序法c语言代码_用冒泡法对数组a进行排序

    大家好,又见面了,我是你们的朋友全栈君 选择法排序 选择法排序是指:如果要把一个数组从小到大排列,那么就从该数组中依次选择最小的数字来排序。...冒泡法排序 冒泡法排序是指:在排序时,每次比较数组中的相邻两个数组元素的值,将较小的数排在较大的数前面。...只有内外循环交错才能保证排序顺利进行。冒泡法排序是相对稳定的排序方法。...折半法排序对于较大的n时有较快的运算速度,但是折半法排序是不稳定的,对应有相同关键字的记录,排序后结果可能会颠倒次序。但是可以通过对这种排序方法的学习,来熟悉了解一些递归的思想,以及二分法的实现。...CelerityRun(left,j,array); if(right > i) CelerityRun(i,right,array); } 在do while整个循环的过程中,middle的值是不变的 C语言中数组的排序算法

    1.5K20

    C++经典算法题-排序法 - 改良的选择排序

    36.排序法 - 改良的选择排序 说明 选择排序法的概念简单,每次从未排序部份选一最小值,插入已排序部份的后端,其时间主要花费于在整个未排序部份寻找最小值,如果能让搜寻最小值的方式加 快,选择排序法的速率也就可以加快...,Heap排序法让搜寻的路径由树根至最后一个树叶,而不是整个未排序部份,因而称之为改良的选择排序法。...解法 Heap排序法使用Heap Tree(堆积树),树是一种资料结构,而堆积树是一个二元树,也就是每一个父节点最多只有两个子节点(关于树的详细定义还请见资料结构书籍),堆积树的 父节点若小于子节点,则称之为最小堆积...如此重覆步骤之后,由于使用一维阵列来储存堆积树,每一次将树叶与树根交换的动作就是将最小值放至后端的阵列,所以最后阵列就是变为已排序的状态。...其实堆积在调整的过程中,就是一个选择的行为,每次将最小值选至树根,而选择的路径并不是所有的元素,而是由树根至树叶的路径,因而可以加快选择的过程, 所以Heap排序法才会被称之为改良的选择排序法。

    57410

    python用冒泡法排序_数组冒泡排序c语言函数

    print(number) 用Python实现从输入若干个整数,直接输入回车表示结… 用Python实现从输入若干个整数,直接输入回车表示结束,用冒泡法进行排序… 用Python实现从输入若干个整数,...直接输入回车表示结束,用冒泡法进行排序 python 解决冒泡排序法 实在看不懂呀 谁能一行一行… 这个看起来简单,却并不好解释。...python冒泡排序法求告知哪里错了_(:з」∠)_ 恩…Python小新人刚学到冒泡排序那里..回家试了一下不知道为什么就是不对求告知哪里错了,还有最后的None请问是啥..怎么去掉谢谢!!...list_sort_test(list_test)) 其中函数list_sort_new()和list_sort_old()都能实现你的目的,其中list_sort_new()中使用了指派运算, 就相当于c语言的...scanf(“%d”,&a[i]); for (j = 0; j 法排序 for (i = 0; i < 9- j; i++) { if(a[i] > a[i + 1]

    1.1K10

    C++经典算法题-排序法 - 改良的气泡排序

    35.Algorithm Gossip: Shaker 排序法 - 改良的气泡排序 说明 请看看之前介绍过的气泡排序法: for (i = 0; i < MAX - 1 && flag == 1; i+...[j + 1], number[j]); flag = 1; } } } 事实上这个气泡排序法已经不是单纯的气泡排序了...,它使用了旗标与右端左移两个方法来改进排序的效能,而Shaker排序法使用到后面这个观念进一步改良气泡排序法。...解法 在上面的气泡排序法中,交换的动作并不会一直进行至阵列的最后一个,而是会进行至MAX-i- 1,所以排序的过程中,阵列右方排序好的元素会一直增加,使得左边排序的次数逐渐减少,如我们的例子所示: 排序前...,Shaker排序使用了这个概念,如果让左边的元素也具有这样的性质,让左右两边的元素都能先排序完成,如此未排序的元素会集中在中间,由于左右两边同时排序,中间未排序的部份将会很快的减少。

    89700

    选择排序法

    选择排序法 分析 假设已经给定了一个无序数组,现在需要将其按照一定顺序排好。现在我们使用选择排序法,每次从数组中选出一个最大的元素并将其与数组最后一个元素交换位置,使数组最后一个元素变为最大的。...随着排序的进行,每次需要检查的元素数在逐渐减少,最后一次需要检查的元素都只有一个。既然如此,运行时间怎么还是O(*n*2)呢?这个问题问得好,这与大O表示法中的常数相关。...— 《算法图解》 代码实现 C语言实现 因为C中对数组的删除比较麻烦,所以我没有按照《算法图解》中的思路每次选择最小的元素,而是选择了最大的。...void SelectionSort(int arr[], int length){ //C在函数中传数组长度较为麻烦,所以在数组定义出就将长度定义好传了过来 int i, temp...biggest_index] = arr[length - 1]; arr[length -1] = temp; length --; } } JAVA语言实现 JAVA实现思路同C。

    40220

    python中对列表元素大小排序(冒泡排序法,选择排序法和插入排序法)—排序算法

    本文主要讲述python中经常用的三种排序算法,选择排序法,冒泡排序法和插入排序法及其区别。通过对列表里的元素大小排序进行阐述。...一、选择排序法 选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。 1....算法步骤 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。 重复第二步,直到所有元素均排序完毕 2....arr[x], arr[y] = arr[y], arr[x] return arr print(selectionSort([1, 3, 1, 4, 5, 2, 0])) 二、冒泡排序法...arr[y], arr[y + 1] = arr[y + 1], arr[y] return arr print(bubbleSort([1, 3, 1, 4, 5, 2, 0])) 三、插入排序法

    1.7K30
    领券