排序算法:选择排序

本文详细介绍了选择排序的基本思想及其实现方式,并通过C++和Java代码进行了具体演示。此外,还对比了选择排序与冒泡排序在不同数据规模下的性能差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

选择排序思路:
      每次从序列中选取最小的元素与序列前端的元素交换,依次类推,对于长度为n的序列,进行n-1趟排序后序列将变为有序。
      由于每趟排序过程中,都是比较完成后才进行交换,所以选择排序的交换次数为n-1次,如果考虑到最小元素可能就是当前元素无需交换,则选择排序的交换次数<=n-1。

以长度为6的序列 {6,3,5,4,1,2} 的选择排序过程做示范:
第一趟排序:[1] 3 5 4 6 2 (最小元素1与6交换)
第二趟排序:[1 2] 5 4 6 3 (最小元素2与3交换)
第三趟排序:[1 2 3] 4 6 5 (最小元素3与5交换)
第四趟排序:[1 2 3 4] 6 5 (4为最小元素无需交换)
第五趟排序:[1 2 3 4 5] 6 (最小元素5与6交换)

本文根据上述的选择排序思路给出C++与Java的代码实现,并且使用Java对选择排序算法和排序算法:冒泡排序中的两种冒泡算法进行性能比较。

C++代码实现:

void swap(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

void SelectSort(int *arr, int length)
{
    if (arr == NULL || length <= 0)return;
    int index;
    int min;
    for (int i = 0; i < length-1; ++i)
    {
        min = arr[i]
        index = i;
        for (int j = i + 1; j < length; ++j)
        {
            if (arr[j] < min)
            {
                index = j;
                min = arr[j];
            }
        }
        if (index != i)swap(&arr[i], &arr[index]);
    }

Java代码:

private void selectSort(List<Integer> list) {
    int length = list.size();

    for (int i = 0; i < length - 1; ++i) {
        int min = list.get(i);
        int indexOfMin = i;
        for (int j = i + 1; j <= length - 1; ++j) {
            int currentNum = list.get(j);
            if (currentNum < min) {
                min = currentNum;
                indexOfMin = j;
            }
        }
        if (indexOfMin != i) {
            swap(list, i, indexOfMin);
        }
    }
}

使用完全相同的元素为整数的List对选择排序算法以及两种冒泡排序算法进行性能测试结果如下:

序列元素个数为1000时:
这里写图片描述

序列元素个数为5000时:
这里写图片描述

序列元素个数为10000时:
这里写图片描述

序列元素个数为50000时:
这里写图片描述

可以发现,选择排序的效率表现是远远高于冒泡法的,其中一个很重要的原因就是选择排序法的交换次数一定是小于等于N的,这大大的降低了程序运行过程中的开销。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值