直接选择排序及其稳定性分析

news/2024/11/8 15:33:05/

直接选择排序

直接选择排序是一种很直观的排序方法。其操作是这样:先在未排序的序列中选择最小的元素(或最大的元素),把它与第一个元素交换,放在第一个位置,再在剩余未排序序列中选择第二小的,与第二个元素交换,放在第二个位置,以此类推,直到所有序列排序完毕。

这种排序方法应该是大部分人最直观的一种排序方法,下面就根据一个实际例子来看看其过程。

排序过程

下面以一个未排序的数组[5,1,2,3,4]为例,展示其排序过程:

select_sort

算法效率

时间复杂度: O ( n 2 ) O({n}^{2}) O(n2),因为无论数组是哪种情况,都需要进行两次for循环,都是确定数组前n-1个最小值,即使数组是本身有序的。

空间复杂度 O ( 1 ) O({1}) O(1),因为只使用有限个数的变量。

实现代码

#include <stdio.h> void swap(int *xp, int *yp) 
{ int temp = *xp; *xp = *yp; *yp = temp; 
} void selectionSort(int arr[], int n) 
{ int i, j, min_idx; // One by one move boundary of unsorted subarray for (i = 0; i < n-1; i++) { // Find the minimum element in unsorted array min_idx = i; for (j = i+1; j < n; j++) if (arr[j] < arr[min_idx]) min_idx = j; // Swap the found minimum element with the first element swap(&arr[min_idx], &arr[i]); } 
} /* Function to print an array */
void printArray(int arr[], int size) 
{ int i; for (i=0; i < size; i++) printf("%d ", arr[i]); printf("\n"); 
} // Driver program to test above functions 
int main() 
{ int arr[] = {64, 25, 12, 22, 11}; int n = sizeof(arr)/sizeof(arr[0]); selectionSort(arr, n); printf("Sorted array: \n"); printArray(arr, n); return 0; 
} 

have a try

稳定性分析

稳定性就是指对于两个关键字相等的记录,它们在序列中的相对位置,在排序之前和排序之后没有发生改变。通俗地讲就是有两个关键字相等的数据A、B,排序前,A的位置是 i ,B的位置是 j,此时 i < j,则如果在排序后A的位置还是在B之前,那么称它是稳定的。

直接选择排序是一个不稳定的排序,其将最小值和队头元素的交换过程可能会导致相同元素的顺序发生交换。

例如下面的例子, [3A, 2, 3B, 5, 1], 其最终将排序成[1, 2, 3B, 3A, 5],如下图所示:

select_sort2

可以看出在这个过程中,相同元素的相对位置发生了改变。


http://www.ppmy.cn/news/484340.html

相关文章

86墙插双联明装新款:蓝奥声智能用电设备安全防护有多强

物理绝缘和智能数据分析安全技术重塑了墙壁插座的安全标准&#xff0c;极大可能规避日常生活中的意外&#xff0c;只有做到意外情况下也不会触电&#xff0c;这样的墙壁插座才能真正叫安全墙壁插座&#xff0c;“不触电且足够安全”应该成为墙壁插座的安全标配标准。 智能物理…

MySQL 中的 CASE语句底层实现

1. 概述 CASE 表达式是 SQL 中用于条件判断的一种常用语法。它可以根据满足不同条件时需要返回的值来进行操作。在 MySQL 中&#xff0c;CASE 表达式有两种形式&#xff1a;简单 CASE 和搜索 CASE。简单 CASE 对比指定值和表达式的值进行操作&#xff0c;而搜索 CASE 则对多个…

vue3 + TS + elementplus + pinia实现后台管理系统左侧菜单联动实现 tab根据路由切换联动内容

效果图&#xff1a; home.vue页面代码 <template><el-container><el-aside width"collapse ? 200px : 70px"><el-button color"#626aef" click"collapseToggle()"><el-icon><Expand v-if"collapse"…

面试了数十家公司总结的Linux运维试题精华

下面是一名资深Linux运维求职数十家公司总结的Linux运维面试精华&#xff0c;助力大家跳槽找个高薪好工作。 1、什么是运维&#xff1f;什么是游戏运维&#xff1f; 1&#xff09;运维是指大型组织已经建立好的网络软硬件的维护&#xff0c;就是要保证业务的上线与运作的正常…

功率是电压电流乘积的波形在一个周期内积分后除以周期。

功率是电压电流乘积的波形在一个周期内积分后除以周期。也就是说功率是电压电流乘积波形中的直流分量。

电压、功率化为dB

电压、功率等化为dB 类别真值dB电压/电流A20log(A)功率A10 log (A)信噪比A10log(A) 功率增益等于电压增益&#xff0c;所以一个是20一个是10.

基于STM32F103单片机的直流电压电流检测仪原理图PCB设计

系统功能设计 本系统由STM32F103C8T6单片机核心板、ACS712电流检测模块、电压采集、LCD1602液晶及电源组成。 1、通过单片机检测电压&#xff08;15V内&#xff09;和直流电流&#xff08;5A内&#xff09;&#xff0c;并在1602液晶上显示。 2、电压和电流的显示最小单位0.1V,…

交流电压电流采样基础知识

家庭、商用、工业上被广泛应用的大多都是交流电。之所以叫做交流电是因为其大小和方向都是随时间不断交替变换的电流&#xff0c;简称交流。在交变电动势作用下&#xff0c;电路中的电流、电压都是交变的&#xff0c;这样的电路叫做交流电路。 正弦交流电这样循环变化一周所需…