冒泡排序Vs直接选择排序

什么是排序?为什么要使用排序?其实我们生活中处处都用到了排序,拿字典来说,现在,我们要在字典中查找某个字(已经知道这个字的读音),首先,我们需要根据这个字的读音,找到它所所在目录中的位置,然后根据这个字的所在页数准确的定位到这个字的位置。

在查找字的过程中,我们注意到了这样的字眼,根据读音找到。。。位置,根据页数定位这个字的位置,我们在无意识的情况下,使用到了排序和查找,字典的编写者对整部字典进行了排序,我们的工作就是根据字典的排序方法查找某个记录。下面详细的介绍排序的相关内容。

排序是一个处理数据的过程,它总是和查找共同出现,因为排序的目的就是方便查找数据,排序的好坏决定了查找的效率。

排序的方法有很多种,这里我选取了两个较为简单且有代表性的两种排序方法进行比较。冒泡排序和直接选择排序。下面我将从排序的方法、时间复杂度、稳定性和特点等几方面来介绍。

基本过程:

冒泡排序的过程就是在一个集合中,依次将每两个数据进行比较,然后把较大的数据放到后边,这样,每个过程结束后,最后一个数据总是最大的。冒泡排序的过程图示:

直接选择排序的过程就是,把一个集合中的最小的数据放到一个已经排好顺序的序列中,它和冒泡排序排列次序刚好相反,是从第一个数据开始排列的。直接选择排序图示:

时间复杂度:

可以看得出来,冒泡排序使用到了两层循环,它的时间复杂度是O(n^2);直接选择排序也是用到了两层循环,它的时间复杂度也是O(n^2)。

算法稳定性:

稳定性就是一个数据集合中,假设有两个数据相等,排序结束后,如果两个数据的前后位置发生变化,则这个排序方法是不稳定的。冒泡排序过程总,只有连续的两个数据会交换数据,也就是说,两个相同的数据是不会发生位置交换的,所以冒泡排序是稳定的排序方法。直接选择排序过程中,任何位置的两个数据都有可以交换位置,所以,直接选择排序是不稳定的排序方法。


算法


平均时间复杂度


最坏时间复杂度


空间复杂度


稳定性


冒泡排序


O(n^2)


O(n^2)


O(1)


稳定


直接选择排序


O(n^2)


O(n^2)


O(1)


不稳定

在所有的算法中,没有哪一种是最优的。就时间复杂度而言冒泡排序和直接选择排序,时间代价都是比较大O(n^2);就带排序数据而言,如果初始序列已经基本有序,则使用冒泡排序法更好,它的时间复杂度接近O(n);在实际情况中,我们应该根据不同的情况选择不同的算法,如果有必要,可以同时将多种算法结合起来使用。

时间: 2024-10-11 20:12:57

冒泡排序Vs直接选择排序的相关文章

冒泡排序与简单选择排序——Java实现

1.冒泡排序 1)原理说明:重复遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 2)代码实现: package com.test.sort; public class BubbleSort { public static void sort(int[] data) { for (int i = 0; i < data.length; i++) { for (int j = data.length

排序(二)__冒泡排序、简单选择排序和直接插入排序

前面<排序(一)__综述>提到按照算法的复杂度分为简单算法和改进算法两大类,本文主要就简单算法中的冒泡排序.简单选择排序和直接插入排序进行通俗详细的解析. 一.冒泡排序 1.基本概念 冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止.(动态图来自维基百科) 2.关键代码(优化之后) void BubbleSort(SqList *L) { int i,j; Status flag=TRUE;            //flag用作标记,避

直接插入排序、二分插入排序、希尔排序、冒泡排序与简单选择排序

一.直接插入排序 稳定,时间复杂度:最好O(n).最差O(n^2).平均O(n^2),空间复杂度O(1) void InsertSort(int L[], int n) { int i, j,key; for (i = 1; i<n; i++) if(L[i] < L[i-1])//需要将L[i]插入到有序表L[0...i-1] { key = L[i]; for(j = i-1; j >= 0 && key < L[j]; j--)//后移 L[j+1] = L[

七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)

 写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列.因此排序掌握各种排序算法非常重要.对下面介绍的各个排序,我们假定所有排序的关键字都是整数.对传入函数的参数默认是已经检查好了的.只是简单的描述各个算法并给出了具体实现代码,并未做其他深究探讨. 基础知识: 由于待排序的记录数量不同,使得排序过程中设计的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是待排序记录存放在计算机随机存储器中进行的排序过程.另一类是外部排序,

排序算法学习之简单排序(冒泡排序,简单选择排序,直接插入排序)

一.冒泡排序 冒泡排序算是最基础的一种算法了,复杂度为O(N^2),其基本思想是:从最低端数据开始,两两相邻比较,如果反序则交换.代码如下: /*最基本的冒泡排序*/ void BubbleSort1 (int n, int *array) /*little > big*/ { int i, j; for (i=0; i<n-1; i++) { for (j=n-1; j>i; j--) { if (array[j] < array[j-1]) { int temp = array

冒泡排序、简单选择排序、直接插入排序

冒泡排序(Bubble Sort)的基本思想:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止.时间复杂度为O(n2). 简单选择排序(Simple Selection Sort)的基本思想:通过n-i次关键字之间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录交换.应该说,尽管与冒泡排序同为O(n2), 但简单选择排序的性能上还是要略优于冒泡排序. 直接插入排序(Straight Insertion Sort)的基本思想:将一个记录插入到前面已经排序好的有序表中

Java 的冒泡排序、直接选择排序和反转排序方法

冒泡排序: System.out.println(Arrays.toString(arr)); int temp = -1; for(int i=0;i<arr.length;i++) { for(int j=i+1;j<arr.length;j++) { if(arr[i]>arr[j]) { temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } System.out.println(Arrays.toString(arr)); 直接

Java冒泡排序与直接选择排序代码随笔

冒泡排序:延申的有很多种,有的是先确定最大值放到后面,有的是先确定最小值放到前边,还有就是反过来,先确定最小值的位置,但是本质都是:不断两两比较,交换位置...第一趟确定一个最大(最小)值放到前边(后边),第二趟,排除选的最值继续排....趟数是外循环控制,交换位置的事交给内循环. 直接选择排序:这个应该比冒泡排序快,因为它内循环只是确定最大(小)索引值,然后在外循环的内部只有一次交换最值,而冒泡排序只要值不一样,每次都要交换相对最值,下面看代码再理解一下. 嵌套循环中,一般把外部循环的变量导入

冒泡排序算法和选择排序算法

这是最基本的两种排序算法,比它效率高的还有归并排序,堆排序,快速排序等算法,作为一个IT民工应该好好掌握. 冒泡排序和选择排序都有两层循环,下面逐一介绍: 冒泡排序: 1.外层循环,控制冒泡次数,起始从loop=1开始,结束标识是loop<length,循环length-1次(从数组的第二个数开始冒泡). 2.内层循环,选出对应轮的最大数,即第K轮冒泡选出的是第N-k-1大的数,故循环从loop=0开始,结束标志loop<N-k,循环N-k次. 选择排序: 1.外层循环,控制比较次数,第i轮设