C语言编程:选择法排序

C语言编程:选择法排序,第1张

选择排序是一种简单直观的排序算法。

工作原理:

  每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

性能:

  选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交瞎余正换,导致第一个5挪动到第二个5后面)。

  选择排序的时间复杂度是O(n^2)

思想:

n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:

①初始状态:无序区为R[1..n],有序区为空。

②第1趟排序

在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

……

③第i趟排序

第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

C语言版代码:

#include <stdio.h>

#include <math.h>

 

#define MAX_SIZE 101

#define SWAP(x, y, t)  ((t) = (x), (x) = (y), (y) = (t))

 

void sort(int[], int)      /* selection sort */

 

int main()

{

    int i, n

    int list[MAX_SIZE]

    printf("Enter the number of numbers to generate: ")

    磨悔scanf_s("%d", &n)

    if (n < 1 || n > MAX_SIZE){

        fprintf(stderr, "Improper value of n\n")

        exit(1)

    }

    for (i = 0 i < n i++){    /* randomly generate numbers */

        list[i] = rand() * 1000

        printf("%d ", list[i])

    }

    sort(list, n)

    printf("\n Sorted array:\n")

    for (i = 0 i < n i++)    /* print out sorted numbers */

        printf("%d ", list[i])

    printf("\n")

    return 0

}

void sort(int list[], int 毁哪n)

{

    int i, j, min, temp

    for (i = 0 i < n - 1 i++){

        min = i

        for (j = i + 1 j < n j++)

        if (list[j] < list[min])

            min = j

        SWAP(list[i], list[min], temp)

    }

}

选择排序毁凳改进了冒泡排序,每次遍历列表只做一次交换,为了做到这一点,一个选择排序在遍历时寻找最大的值,并在完成遍历后,将其放到正确的地方。

第二次遍历昌中,找出下一个最大的值。遍历n-1次排序n个项,最终项必须在n-1次遍历之后。

接下来呢,我们直接进行把最小值放到已排序序列末尾的 *** 作。当然这是第一轮循环,还没有产生已排序的序列。0就是已排序序列的开头数字了。

第二轮初始化开始,我们继续选取假设的最小值,这次,我们还是选取第一个数字作为假设的最小耐余山值,需要注意的是,0已经是已排序序列,我们要从未排序的序列中选取第一个数字,也就是(5、1、8、6、2、3、4、9、7)无序序列中的数字5。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12397080.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存