首页 > 其他分享 >简单选择排序

简单选择排序

时间:2023-11-19 11:37:13浏览次数:31  
标签:arr 元素 冒泡排序 选择 简单 排序

目录

本文主要介绍简单选择排序的基本原理、具体例子,以及代码实现。

基本原理

简单选择排序的基本原理是:

  1. 在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
  2. 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
  3. 重复第二步,直到所有元素均排序完毕。
    选择排序的主要优点与其简洁性有关,在实际应用中,适合于元素个数较少的情况。
    选择排序的时间复杂度为O(n^2),其中n为数组的长度。

举例

假设我们有一个数组 [5, 8, 6, 3, 9, 2, 1, 7],我们要对其进行升序排序,使用简单选择排序的过程如下:

  1. 首先在未排序序列中找到最小的元素1,将其与序列的第一个元素5交换,得到 [1, 8, 6, 3, 9, 2, 5, 7]。
  2. 然后在剩下的未排序元素中找到最小的元素2,将其与第二个元素8交换,得到 [1, 2, 6, 3, 9, 8, 5, 7]。
  3. 继续这个过程,我们可以得到 [1, 2, 3, 6, 9, 8, 5, 7] -> [1, 2, 3, 5, 9, 8, 6, 7] -> [1, 2, 3, 5, 6, 9, 8, 7] -> [1, 2, 3, 5, 6, 7, 9, 8] -> [1, 2, 3, 5, 6, 7, 8, 9]。
  4. 最后,我们得到了完全排序的数组 [1, 2, 3, 5, 6, 7, 8, 9]。
    这就是简单选择排序的基本过程。

示例代码

以下是简单选择排序的C语言实现:

#include <stdio.h>

void selectSort(int arr[], int n) {
    int i, j, minIndex, temp;
    for (i = 0; i < n - 1; i++) {
        minIndex = i;
        for (j = i + 1; j < n; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        if (minIndex != i) {
            temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
    }
}

int main() {
    int arr[] = {5, 8, 6, 3, 9, 2, 1, 7};
    int n = sizeof(arr) / sizeof(arr[0]);
    selectSort(arr, n);
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

在这段代码中,我们首先定义了一个selectSort函数,该函数接受一个整数数组和数组的长度作为参数。在函数中,我们使用两个嵌套的for循环来遍历数组,找到最小的元素,并将其放到正确的位置。然后在main函数中,我们创建了一个数组,并调用selectSort函数对其进行排序,最后打印出排序后的数组。

总结

简单选择排序 VS 堆排序

简单选择排序和堆排序都是选择排序的一种,它们的共同点是都在每一次迭代中找出剩余元素中的最大或最小值。
不同之处在于:

  1. 简单选择排序:每次迭代时,都要遍历剩余的所有元素来找出最大或最小值,时间复杂度为O(n^2)。
  2. 堆排序:通过构建堆这种数据结构,可以在O(logn)的时间复杂度内找出最大或最小值,然后将其移动到序列的一端,这样整体的时间复杂度就降低到了O(nlogn)。
    所以,可以说堆排序是对简单选择排序的一种改进,它降低了时间复杂度,提高了效率。

简单选择排序 VS 冒泡排序

冒泡排序和简单选择排序都是基本的排序算法,它们的主要区别在于排序过程和效率:

  1. 冒泡排序:它的工作原理是通过重复地遍历待排序的序列,比较每对相邻的元素并交换位置(如果需要),直到整个序列有序。冒泡排序的时间复杂度为O(n^2)。
  2. 简单选择排序:它的工作原理是在每一次迭代中找出未排序元素中的最小(或最大)元素,然后将其放到已排序序列的末尾,直到所有元素都排序完毕。简单选择排序的时间复杂度也为O(n^2)。

主要区别:

  • 冒泡排序是通过每次遍历序列比较并交换相邻元素的位置来实现排序,而简单选择排序则是通过每次找出未排序元素中的最小(或最大)元素来实现排序。
  • 在交换次数上,冒泡排序的数据移动次数通常比简单选择排序要多;冒泡排序是每次比较都可能会交换,而简单选择排序是每轮循环结束后才进行一次交换。
  • 在效率上,当待排序序列基本有序时,冒泡排序的效率较高,因为它可以在实际排序过程中提前结束。而简单选择排序无论序列初始状态如何,都会进行n-1次选择操作,因此不具备提前结束的特性。

标签:arr,元素,冒泡排序,选择,简单,排序
From: https://www.cnblogs.com/lanyangsh/p/17841759.html

相关文章

  • 大师学SwiftUI第18章Part1 - 图片选择器和相机
    如今,个人设备主要用于处理图片、视频和声音,苹果的设备也不例外。SwiftUI可以通过Image视图显示图片,但需要其它框架的支持来处理图片、在屏幕上展示视频或是播放声音。本章中我们将展示Apple所提供的这类工具。图片选择器SwiftUI内置了一个PhotosPicker结构体用于生成一个视图,允许用......
  • 堆排序
    堆是一种特殊的树形数据结构,它满足以下两个性质:完全二叉树:堆是一棵完全二叉树,即除了最底层之外,其他每一层的节点都被完全填满,且最底层的节点都尽可能地集中在左侧。堆属性:对于最大堆(大顶堆)来说,父节点的值总是大于或等于任何一个子节点的值;对于最小堆(小顶堆)来说,父节点的值总是小于或......
  • Docker部署Excalidraw | 一个功能齐全、操作简单的画板
    一、介绍界面简洁,交互细致,上手简单,操作习惯和大部分制图软件相似免注册,支持中文界面,打开浏览器就能开始画图支持众多键盘快捷键操作,配合鼠标能快速画图(适配触摸屏)内容安全受保护,Excalidraw采用端到端加密,绘图内容不会上传到服务器支持通过网页链接共享协作二、部署Excalid......
  • 分享我对DiscuzQ这款现代化开源轻社区的二次开发成果。DiscuzQ依然是站长的最佳选择!
    简要说一下二开的功能:贴文列表样式优化、增加国内AI大模型功能、增加社区AI助手(会自动发帖和回帖)、编辑器功能优化、pc端导航优化、h5端导航优化、修复各种加载不出来加载缓慢的问题等等细节。还有多少站长在使用DiscuzQ呢?我为什么选择了DiscuzQ?一个月前,我在寻找合适......
  • Docker部署Excalidraw | 一个功能齐全、操作简单的画板
    一、介绍界面简洁,交互细致,上手简单,操作习惯和大部分制图软件相似免注册,支持中文界面,打开浏览器就能开始画图支持众多键盘快捷键操作,配合鼠标能快速画图(适配触摸屏)内容安全受保护,Excalidraw采用端到端加密,绘图内容不会上传到服务器支持通过网页链接共享协作二、部署Excalid......
  • 简单神经网络(py)
    1importnumpy2#激活函数库3importscipy.special45importmatplotlib.pyplot67#neutralnetworkclassdefinition8classneutralNetwork:9def__init__(self,inputnodes,hiddennodes,outputnodes,learningrate):10#定义各个......
  • 字符串排序 星期几换算
    7-5字符串排序本题要求编写程序,读入5个字符串,按由小到大的顺序输出。输入格式:输入为由空格分隔的5个非空字符串,每个字符串不包括空格、制表符、换行符等空白字符,长度小于80。输出格式:按照以下格式输出排序后的结果:Aftersorted:每行一个字符串输入样例:redyellow......
  • 堆以及堆的应用--堆排序
    堆定义:什么是堆?从堆的定义上我们可以看出,堆在物理结构上是一维数组,逻辑结构上,可以把堆理解为一棵完全二叉树,因为堆满足ki<=k2i+1,ki<=k2i+2(ki>=k2i+1,ki>=k2i+2),而我们了解对于完全二叉树,父结点和孩子结点存储在一维数组中有如下的下标关系:leftchild=parent*2+1rightchild=parent*2......
  • Halo2简单示例
    Halo2简介[[Halo2]]是使用[[Rust]]语言开发,基于[[PLANK算法]]的,一款开源交互式([[STARKs]]),[[零知识证明(ZKP)]]的[[证明系统]]。GitHub仓库地址:halo2不同于普通的开发框架,Halo2中的功能开发称为电路(Circuit)开发,电路开发使用表格来设计并记录运算,并包含一系列的约束来验证......
  • 路由简单入门
     1地址和视图函数的映射关系---urls.py文件#urlpatterns列表,列表内放了url函数的执行结果#使用很简单,复制一行,改一下第一个参数(正则表达式),第二个参数是视图函数内存地址urlpatterns=[url(r'^admin/',admin.site.urls),#在内部,请求来了,路径匹配成功,内部自动调用......