选择排序的时间复杂度分析

每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最前(最后),直到全部待排序的数据元素排完。选择排序是不稳定的排序方法。

选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。比较拗口,举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。

方法一:

template<class T>

void SelectSort(T a[],int n)

{

for (int i = n-1;i>0;--i)

{

int max = i;

for (int j = 0;j < i;++j)

if (a[j] > a[max])

max = j;

if (max != i)

Swap(a[i],a[max]);

}

}

方法二:

template<class T>

void SelectSort(T a[],int n)

{

for (int i = n-1;i > 0;--i)

{

int max = 0;

for (int j = 1;j <= i;++j)

if (a[j] > a[max])

max = j;

if (max != i)

Swap(a[i],a[max]);

}

}

方法三:

template<class T>

void SelectSort(T a[],int n)

{

bool sorted = false;

for (int i = n-1;!sorted&&i > 0;--i)

{

sorted = true;

int max = 0;

for (int j = 1;j <= i;++j)

{

if (a[j] > a[max])

max = j;

else

sorted = false;

}

if (max != i)

Swap(a[i],a[max]);

}

}

方法二和方法三更加像冒泡排序了,不过还是有区别的,至少交换的次数变少了。

对于方法一和方法二,比较次数O(n^2),比较次数与关键字的初始状态无关,最好和最坏情况下都为O(n^2),但是对于方法三,最好情况下外层循环只执行一次,里面执行n-1次,因此时间复杂度为O(n),最坏情况下仍为O(n^2)。



选择排序的时间复杂度分析,布布扣,bubuko.com

时间: 2024-10-06 21:20:32

选择排序的时间复杂度分析的相关文章

合并排序算法时间复杂度分析

一.合并已排序的两个数组,依次比较两个数组元素大小,并按大小加入到暂存数组B,最后保存到A: Algorithm: MERGE(A, p, q, r) 输入:数组A[p...q]和A[q+1...r],各自按升序排列 输出:将A[p...q]和A[q+1...r]合并后的升序排序的新数组 01. s←p; t←q+1; k←p; {s, t, p 分别指向A[p...q], A[q+1...r]和暂存数组B} 02. while s≤q and t≤r 03. if A[s] ≤A[t] the

对于近似有序序列(即除掉少数K个元素后是有序序列且K&lt;&lt;n),试分析直接插入排序,冒牌排序和简单选择排序的时间复杂度

学弟问的一道数据结构的题,关于一些排序算法的时间复杂度. 针对近似有序序列, ①当使用直接插入排序时,其基本操作为数组中元素的移动.最好情况下,待排序列有序,无需移动,此时时间复杂度为O(n), 当为近似有序序列是,其基本操作执行的次数是K次当前循环的最大值的和,即时间复杂度为O(k.n)由于k远小于n, 综合考虑直接插入排序的时间复杂度为O(n) ②当使用冒泡排序时,默认为普通冒泡排序,其基本操作为元素间比较的次数,因此无论 是否是近似有序,时间复杂度均为O(n^2) ③当使用简单排序时,其基

【排序算法】选择排序

选择排序算法原理 选择排序算法时间复杂度分析 选择排序算法稳定性分析 选择排序算法C语言代码 #include <stdio.h> //交换两个元素的值 void swap(int* a, int* b) { int temp; temp = *a; *a = *b; *b = temp; } void selectionSort(int arr[], int length) { int i, j, maxIndex; for(i = length; i > 0; i--) { //假设

排序——直接选择排序(简单选择排序)

直接选择排序也称简单选择排序,是一种相对简单的排序算法,它的基本思想是:从一列数中找出最小的,和第一个交换:剩下的重新找出最小的,和这列数的第二个交换,......一直进行n-1次比较之后,该数列已经为有序数列了. 例如:已知一组无序数列:6 3 5 1 4 2 9 第一次:[6 3 5 1 4 2 9] 最小数为:1 第二次:1 [3 5 6 4 2 9] 最小数为:2 第三次:1 2 [5 6 4 3 9] 最小数为:3 第四次:1 2 3 [6 4 5 9] 最小数为:4 第五次:1 2

排序算法系列——直接选择排序

前面两篇介绍了两种插入排序算法:直接插入排序和希尔排序.这篇介绍选择排序的一种:直接选择排序.从名字就可以看出直接选择排序与直接插入排序很相似,两者相同点在与都是将待排序序列分成有序区和无序区两部分,不同之处在于直接插入排序是从无序区选出一个插入到有序区合适的位置,而直接选择排序是从无序区选出最小的一个插入到有序区尾部,使得有序区保持有序. 基本思想: 一组待排序的数据,首先将其划分成两部分,一部分是已排好序的,另一部分是待排序的,然后依次从待排序部分取出最小的元素插入到已排序部分的尾部,保证有

选择排序javascript

简单选择排序是人们最熟悉的比较方式,其算法思想为:从数组的开头开始,将第一个元素和其他元素进行比较.检查完所有元素后,最小的元素会被放到数组的第一个位置,然后算法会从第二个位置继续.这个过程会一直进行,当进行到数组的倒数第二个位置时,所有的数据便完成了排序. 代码如下: 分析可得,简单选择排序的时间复杂度为O(n2).选择排序的主要操作是进行关键字之间的比较,因此改进简单选择排序应该从如何减少比较出发.其实现实生活中就有一个很好的例子,就是比赛总的锦标赛.8个人中选出冠军其实不需要7+6+5=1

算法导论 第6章 堆排序(简单选择排序、堆排序)

堆数据结构实际上是一种数组对象,是以数组的形式存储的,可是它能够被视为一颗全然二叉树,因此又叫二叉堆.堆分为下面两种类型: 大顶堆:父结点的值不小于其子结点的值,堆顶元素最大 小顶堆:父结点的值不大于其子结点的值,堆顶元素最小 堆排序的时间复杂度跟合并排序一样,都是O(nlgn),可是合并排序不是原地排序(原地排序:在排序过程中,仅仅有常数个元素是保存在数组以外的空间),合并排序的全部元素都被复制到另外的数组空间中去,而堆排序是一个原地排序算法. 1.在堆排序中,我们通常使用大顶堆来实现,因为堆

简单选择排序算法 Simple Selection Sort

1.简单选择排序法的思想: 通过n-i 次关键字间的比较,从n-i+1 个记录中选出关键字最小的记录,并和第i (1<= i <=n)个记录交换之. 1 void SelectSort( SqList * L) 2 { 3 int i, j, min; 4 for(i=1; i<L->length; i++) 5 { 6 min = i; 7 for(j=i+1; j<=L->length; j++) 8 { 9 if(L->r[min] > L->r

笔记二:计数排序、选择排序、冒泡排序、插入排序

计数排序 1. 名次 :所谓名次,通俗理解即为该元素在序列中排行老几的意思. 2..如何求名次:依次对每一个元素进行比较,若排在自己(该元素)前面的元素比自己大,则前面的元素在排行计数上加1,反之则自己加1. 3.利用附加数组的计数排序:根据自身名次重新整理一份排序序列存储在附加数组中,然后将附加数组值拷贝到原序列中. 1)代码: template<typename T> void SortClass<T>::rank(T a[], int n, int r[]) { //给数组a