• 选择排序


    概要

    本章介绍排序算法中的选择排序。

    目录
    1. 选择排序介绍
    2. 选择排序图文说明
    3. 选择排序的时间复杂度和稳定性
    4. 选择排序实现
    4.1 选择排序C实现
    4.2 选择排序C++实现
    4.3 选择排序Java实现

    转载请注明出处:选择排序 - 如果天空不死 - 博客园


    更多内容:数据结构与算法系列 目录

    选择排序介绍

    选择排序(Selection sort)是一种简单直观的排序算法。
    它的基本思想是:首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置;接着,再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

    选择排序图文说明

    选择排序代码

    1. /*
    2. * 选择排序
    3. *
    4. * 参数说明:
    5. * a -- 待排序的数组
    6. * n -- 数组的长度
    7. */
    8. void select_sort(int a[], int n)
    9. {
    10. int i; // 有序区的末尾位置
    11. int j; // 无序区的起始位置
    12. int min; // 无序区中最小元素位置
    13. for(i=0; i<n; i++)
    14. {
    15. min=i;
    16. // 找出"a[i+1] ... a[n]"之间的最小元素,并赋值给min。
    17. for(j=i+1; j<n; j++)
    18. {
    19. if(a[j] < a[min])
    20. min=j;
    21. }
    22. // 若min!=i,则交换 a[i] 和 a[min]。
    23. // 交换之后,保证了a[0] ... a[i] 之间的元素是有序的。
    24. if(min != i)
    25. swap(a[i], a[min]);
    26. }
    27. }

    下面以数列{20,40,30,10,60,50}为例,演示它的选择排序过程(如下图)。

    排序流程

    第1趟:i=0。找出a[1...5]中的最小值a[3]=10,然后将a[0]和a[3]互换。 数列变化:20,40,30,10,60,50 -- > 10,40,30,20,60,50
    第2趟:i=1。找出a[2...5]中的最小值a[3]=20,然后将a[1]和a[3]互换。 数列变化:10,40,30,20,60,50 -- > 10,20,30,40,60,50
    第3趟:i=2。找出a[3...5]中的最小值,由于该最小值大于a[2],该趟不做任何处理。
    第4趟:i=3。找出a[4...5]中的最小值,由于该最小值大于a[3],该趟不做任何处理。
    第5趟:i=4。交换a[4]和a[5]的数据。 数列变化:10,20,30,40,60,50 -- > 10,20,30,40,50,60

    选择排序的时间复杂度和稳定性

    选择排序时间复杂度
    选择排序的时间复杂度是O(N2)。
    假设被排序的数列中有N个数。遍历一趟的时间复杂度是O(N),需要遍历多少次呢?N-1!因此,选择排序的时间复杂度是O(N2)。

    选择排序稳定性
    选择排序是稳定的算法,它满足稳定算法的定义。
    算法稳定性 -- 假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。则这个排序算法是稳定的!

    选择排序实现

    选择排序C实现
    实现代码(select_sort.c)

    1. /**
    2. * 选择排序:C 语言
    3. *
    4. * @author skywang
    5. * @date 2014/03/11
    6. */
    7. #include <stdio.h>
    8. // 数组长度
    9. #define LENGTH(array) ( (sizeof(array)) / (sizeof(array[0])) )
    10. #define swap(a,b) (a^=b,b^=a,a^=b)
    11. /*
    12. * 选择排序
    13. *
    14. * 参数说明:
    15. * a -- 待排序的数组
    16. * n -- 数组的长度
    17. */
    18. void select_sort(int a[], int n)
    19. {
    20. int i; // 有序区的末尾位置
    21. int j; // 无序区的起始位置
    22. int min; // 无序区中最小元素位置
    23. for(i=0; i<n; i++)
    24. {
    25. min=i;
    26. // 找出"a[i+1] ... a[n]"之间的最小元素,并赋值给min。
    27. for(j=i+1; j<n; j++)
    28. {
    29. if(a[j] < a[min])
    30. min=j;
    31. }
    32. // 若min!=i,则交换 a[i] 和 a[min]。
    33. // 交换之后,保证了a[0] ... a[i] 之间的元素是有序的。
    34. if(min != i)
    35. swap(a[i], a[min]);
    36. }
    37. }
    38. void main()
    39. {
    40. int i;
    41. int a[] = {20,40,30,10,60,50};
    42. int ilen = LENGTH(a);
    43. printf("before sort:");
    44. for (i=0; i<ilen; i++)
    45. printf("%d ", a[i]);
    46. printf("\n");
    47. select_sort(a, ilen);
    48. printf("after sort:");
    49. for (i=0; i<ilen; i++)
    50. printf("%d ", a[i]);
    51. printf("\n");
    52. }

    选择排序C++实现
    实现代码(SelectSort.cpp)

    1. /**
    2. * 选择排序:C++
    3. *
    4. * @author skywang
    5. * @date 2014/03/11
    6. */
    7. #include <iostream>
    8. using namespace std;
    9. /*
    10. * 选择排序
    11. *
    12. * 参数说明:
    13. * a -- 待排序的数组
    14. * n -- 数组的长度
    15. */
    16. void selectSort(int* a, int n)
    17. {
    18. int i; // 有序区的末尾位置
    19. int j; // 无序区的起始位置
    20. int min; // 无序区中最小元素位置
    21. for(i=0; i<n; i++)
    22. {
    23. min=i;
    24. // 找出"a[i+1] ... a[n]"之间的最小元素,并赋值给min。
    25. for(j=i+1; j<n; j++)
    26. {
    27. if(a[j] < a[min])
    28. min=j;
    29. }
    30. // 若min!=i,则交换 a[i] 和 a[min]。
    31. // 交换之后,保证了a[0] ... a[i] 之间的元素是有序的。
    32. if(min != i)
    33. {
    34. int tmp = a[i];
    35. a[i] = a[min];
    36. a[min] = tmp;
    37. }
    38. }
    39. }
    40. int main()
    41. {
    42. int i;
    43. int a[] = {20,40,30,10,60,50};
    44. int ilen = (sizeof(a)) / (sizeof(a[0]));
    45. cout << "before sort:";
    46. for (i=0; i<ilen; i++)
    47. cout << a[i] << " ";
    48. cout << endl;
    49. selectSort(a, ilen);
    50. cout << "after sort:";
    51. for (i=0; i<ilen; i++)
    52. cout << a[i] << " ";
    53. cout << endl;
    54. return 0;
    55. }

    选择排序Java实现
    实现代码(SelectSort.java)

    1. /**
    2. * 选择排序:Java
    3. *
    4. * @author skywang
    5. * @date 2014/03/11
    6. */
    7. public class SelectSort {
    8. /*
    9. * 选择排序
    10. *
    11. * 参数说明:
    12. * a -- 待排序的数组
    13. * n -- 数组的长度
    14. */
    15. public static void selectSort(int[] a, int n) {
    16. int i; // 有序区的末尾位置
    17. int j; // 无序区的起始位置
    18. int min; // 无序区中最小元素位置
    19. for(i=0; i<n; i++) {
    20. min=i;
    21. // 找出"a[i+1] ... a[n]"之间的最小元素,并赋值给min。
    22. for(j=i+1; j<n; j++) {
    23. if(a[j] < a[min])
    24. min=j;
    25. }
    26. // 若min!=i,则交换 a[i] 和 a[min]。
    27. // 交换之后,保证了a[0] ... a[i] 之间的元素是有序的。
    28. if(min != i) {
    29. int tmp = a[i];
    30. a[i] = a[min];
    31. a[min] = tmp;
    32. }
    33. }
    34. }
    35. public static void main(String[] args) {
    36. int i;
    37. int[] a = {20,40,30,10,60,50};
    38. System.out.printf("before sort:");
    39. for (i=0; i<a.length; i++)
    40. System.out.printf("%d ", a[i]);
    41. System.out.printf("\n");
    42. selectSort(a, a.length);
    43. System.out.printf("after sort:");
    44. for (i=0; i<a.length; i++)
    45. System.out.printf("%d ", a[i]);
    46. System.out.printf("\n");
    47. }
    48. }

    上面3种实现的原理和输出结果都是一样的。下面是它们的输出结果:

    before sort:20 40 30 10 60 50 
    after  sort:10 20 30 40 50 60
  • 相关阅读:
    分布式锁的三种实现方式
    基础算法之双指针
    Android向服务器的数据库MySQL传输数据:经过修正的 Android + HTTP + xampp +mysql : Post / Get
    图像处理黑科技——弯曲矫正、去摩尔纹、切边增强、PS检测
    安装配置操作节点(Operator),并获取OCP离线安装文件
    【图像分类】【深度学习】【Pytorch版本】GoogLeNet(InceptionV1)模型算法详解
    用Python订正数据
    Springboot学习笔记——3
    JavaWeb-JSTL标签库
    跨境商城开发秘籍揭密:如何选择最适合你的技术方案?
  • 原文地址:https://blog.csdn.net/u012294613/article/details/125527103