十大经典排序算法之选择排序算法

前言

终于进入到实际算法的学习中来了。算法学习,我打算先从十大经典排序算法入手,从最基础的排序进行算法思维、程序抽象、代码素养这三方面自我纠正和梳理。(因为我感觉我的代码水平非常差,目前只能做到通过边搜遍写的方式完成,完全不能手搓正确的代码,甚至连伪代码都会出现纰漏,实在是惭愧)。我打算以C++为基础,C#、JAVA、Python等选择性梳理,但我相信之后我会逐步完善的。

1、十大经典排序算法

通过对网络资料的梳理,可以列出以下十大经典排序算法(Ten Classical Sorting Problems Algorithm):

选择排序(Selection-Sort)

插入排序(Insertion-Sort)

冒泡排序(Bubble-Sort)

希尔排序(Shell's Sort)/缩小增量排序(Diminishing Increment Sort)

归并排序(Merge-Sort)

快速排序(Quick-Sort)

堆排序(Heap-Sort)

计数排序(Count-Sort)

桶排序(Bucket-Sort)

基数排序(Radix-Sort)

这十大排序所蕴含的一些思想可以认为是入门级的、经典级的,并且对于编程思维的培养是有益的,非常适合我这样一个编程、算法小白去做的。在正式开始写算法内容之前,让我们先来了解一下排序算法的稳定性这个概念。

2、排序算法稳定性的定义:

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,A1=A2,且A1在A2之前,而在排序后的序列中,A1仍在A2之前,则称这种排序算法是稳定的;否则称为不稳定的。用通俗移动的话来说:

稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。

不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面。

闲话不多说,我们开始我们今天的主题:十大经典排序算法之选择排序算法

3、选择算法实例演示

选择排序(Select Sort)是直观的排序。从头开始,依次向后比较,后数中存在的最小值与头部尚未排序的值进行交换。

即在一个长度为n的无序数组中,第一次遍历n-1个数找到最小的和第一个数交换。

第二次从下一个数开始遍历n-2个数,找到最小的数和第二个数交换。

重复以上操作直到第n-1次遍历最小的数和第n-1个数交换,排序完成。

因此,我们可以发现,这个选择排序算法是一个稳定算法。

4、程序(C++、Python)以及注意事项

为了能够体现程序的良好的适配性,我所设计的两个程序都加上了输入任意长度数组的功能。这两个代码即粘即用,数组长度自定。(PS:Python的程序我多加了一步输入数组的长度,因为我对Python如何输入任意长度的数组还不太熟练,但是程序的目的依旧是达到了)

C++程序: 

#include <iostream>//标准头文件
#include<vector>//二维数组头文件

using namespace std;//命名空间
int main()
{
    vector<int>A;//A数组
    int number, i = 0, n;//定义参数
    char chr;

    cout << "输入数组(以空格为分隔符):";
    while (cin >> number)//输入的数字
    {
        A.push_back(number);//尾部数字
        i++;//加数
        cin.get(chr);//获取数字
        if (chr != ' ')
            break;
    }

    n = A.size();//数组长度

    for (int i = 0; i < n; i++)//主算法
    {
        int min = i;
        for (int j = i + 1; j < n; j++)
        {
            if (A[min] > A[j])
            {
                min = j;//后数比前数小,则将后数的序号赋值到前数,形成从小到大
            }
        }
        int temp = A[i];//交换目标值与最小值
        A[i] = A[min];
        A[min] = temp;
    }
    cout << "选择排序后的数组:";
    for (int j = 0; j < n; j++)
        cout << A[j] << " ";

}

 我们以数组[32,21,13,76,48,99,123,12]这样一个长度为8的数组进行测试,结果如下:

测试结果良好。

Python:

##!/usr/bin/python3
#coding=utf-8
#选择算法

import sys
def selection_sort(array):#定义选择算法的函数
     
    for i in range(len(array)-1):#长度为l的数组要进行l-1次比较,i的初始值为0
        min_index = i#初始化最小序号
        for j in range(i+1, len(array)):#从后面的数开始比较
            if array[j] < array[min_index]:
                min_index = j#后面的数小于前面的,则将后数的序号赋值给最小序号
        if min_index != i:#当最小序号不是当前序号时
                array[i], array[min_index] = array[min_index], array[i]#交换两数
    return array

if __name__ == '__main__':#声明一个主函数
    array = []#声明一个不定数组
    lengthofarray=input('Please enter the lenth of the array:')#确定不定数组的长度
    lengthofarray_int=int(lengthofarray)#强制转换成int型,因为range函数中必须是int型不能是str
    for i in range(lengthofarray_int):#开始输入长度为lengthofarray_int的数组(循环lengthofarray_int次)
        array.append(int(input('Please enter each number of the array:')))
    print(selection_sort(array))#调用之前定义的selection_sort函数,完成排序

我们同样以数组[32,21,13,76,48,99,123,12]这样一个长度为8的数组进行测试,结果如下:

这里注意,我们输入数组的时候是输入一个数,打一个回车,并且要保证数组长度和输入的数组长度保持一致(不能长也不能短)(PS:好吧,这里的程序确实有点不太牢靠了,但是能用,只要你不刁难他 :) )

我们用Jupyter运行这个程序

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值