有关快速排序和冒泡排序的理解

冒泡排序:将第一位的值与后面所有的值比较,碰到小的就与其交换,第一次循环得到最小的数,再对后面的数循环,得到最小的数,依次下去,复杂度为o(n*n);

快速排序:将第一位的值与后面的值比较,得到这个值在数组中的准确位置,第一次循环与冒泡排序的复杂度式一样的,都是n,可循环之后把数组分为两个数组,继续对两个数组排序。复杂度为log2(n)*n~n*n。

那么为什快速排序会比冒泡排序快呢?

本质原因是快速排序将每一步比较的信息都利用了,而快速排序则丢失了一些比较的信息。为将两种排序类比为一个全国打架比赛的排名,冒泡排序是从序号为2开始,每个人都和序号为1的人打架,输了的就交换序号,这样先得出最垃圾的那个,可这样的话很可能会丢失一些信息,比如序号为99的实际与序号为100的比过(都不是最垃圾的),知道他们两谁更强,可除了最垃圾的那个人之外,冒泡排序视后面的人是无序的,这样就把99和100比过这个信息浪费了。而快速排序每个比过的人的信息都会被利用,就像前面一个数组的数的最大值都比后面一个数组的最小值小,这就是利用了99实际和100比过等等这些信息,所以快排之后的数组里的实际信息比冒泡排序是要多的。冒泡排序与快速排序都得到了某个数在数组里的准确位置,可快排还得到了更多信息,所以快排比冒泡排序快。

为什么快速排序是不稳定的?

因为每一个数在数组里的位置都是不确定的,意思就是每一个排序后得到的数的准确位置是不确定的,而根据数学可知,数排在数组中间能够得到的有用的信息更多。

时间: 2024-10-22 01:40:18

有关快速排序和冒泡排序的理解的相关文章

冒泡排序深入理解

冒泡排序深入理解 对于冒泡排序有一个小性质: 每一次都会把序列未排好序的最大数"沉底", 即推到序列尾部 1.P4378 Out of Sorts S 留意着农场之外的长期职业生涯的可能性,奶牛Bessie开始在不同的在线编程网站上学习算法. 她到目前为止最喜欢的算法是"冒泡排序".这是Bessie的对长度为N的数组A进行排序的奶牛码实现. sorted = false while (not sorted): sorted = true moo for i = 0

使用JAVA直观感受快速排序与冒泡排序的性能差异

初学算法,肯定会编写排序算法 其中两个最为有名的就是冒泡排序和快速排序 理论上冒泡排序的时间复杂度为O(N^2),快速排序的时间复杂度为O(NlogN) 下面本门使用JAVA,分别编写三段排序程序 对十万个0-9999的整数进行一次冒泡排序 对十万个0-9999的整数进行1000次快速排序,使用递归完成 对十万个0-9999的整数进行1000次快速排序,使用堆栈完成 对十万个0-9999的整数进行一次冒泡排序: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

快速排序、冒泡排序

我目前最常用的两种排序:冒泡排序和快速排序 比较一下他们的性能: 1 #include<stdio.h> 2 3 void QuickSort(int * a,int left,int right) 4 { 5 if(left>right) 6 { 7 return; 8 } 9 int stand=a[left]; 10 int i=left; 11 int j=right; 12 //得到基准数位置 13 while(i!=j) 14 { 15 while(i<j&&a

php实现快速排序和冒泡排序

<?php $arr = array(9,4,12,34,1,43,23,7,3,4,5,6,33,22,12,21,15,62,1222,21,322,432,31,54,64); //$sorted_arr = quickSort($arr); $sorted_arr = bublleSort($arr); var_dump($sorted_arr); // 快速排序算法 function quickSort($arr){ if(count($arr)>1){ $k=$arr[0]; $x

快速排序算法的简单理解

快速排序算法的简单理解 本文用的编程语言为python,简单阐释了作者对快速排序算法的学习心得,尽量用通俗易懂的方式向读者表达.如果文章中有什么纰漏与错误,请读者指正. 在了解快速排序之前,我们先来了解一下递归 递归 递归调用自己的函数 先来看一个函数 def (i): print(i) countdown(i-1) 这是一个不断递减的函数,如果调用这个函数,它会无限循环下去.这可不是一件好事.我们应该给予它一些限制,告诉它什么时候停止调用自己,什么时候调用自己.我们把这种限制分别叫做基线条件与

快速排序和冒泡排序

前言:并不能一文就解释清楚排序到底是怎么一回事,我所有几乎文章都需要和别的材料配合才比较容易产生理解. 推荐书目: <算法精解> <啊哈,算法> 主要内容: 冒泡排序冒泡排序是一种比较简单的排序算法,容易用C语言写成也非常好理解, 但是它的时间效率不高. 快速排序快速排序是常用的排序算法,时间效率高,而且算法简单,但是乍一看上去,是没有冒泡排序那么“粗浅”的, 我不是说冒泡排序粗浅.冒泡两个字已经非常有意思了. 冒泡排序(Bubble sort) 算法过程 如果说你现在有一组数据需

PHP之快速排序和冒泡排序性能对比

//冒泡排序 function bubble_sort($arr){ $count = count($arr); for($i=0;$i<$count;$i++){ for($j=$count-1;$j>$i;$j--){ if($arr[$j]<$arr[$j-1]){ $tmp = $arr[$j]; $arr[$j] = $arr[$j-1]; $arr[$j-1] = $tmp; } } } return $arr; } //快速排序 function quick_sort($a

为什么我写的快速排序比冒泡排序慢?

//快速排序 public class QuickSort {     public static void quickSort(int[] a,int low,int high){         int mid;         int ltemp,rtemp;         ltemp=low;rtemp=high;         mid=a[(low+high)>>>1];         while(ltemp<rtemp){//把比mid小的放在左侧,比mid大的放

用多线程判断快速排序和冒泡排序的速度

一般的,我们知道快排是优于冒泡排序的,下面就让我们用多线程验证一下,具体操作:先产生一个随机整数n(大于10),再产生n个随机正数存放于数组中,然后创建两个线程并发地对锁生成的随机整数进行排序,其中一个线程采用冒泡排序,另一个线程采用快速排序,最后比较这两个线程哪个先完成排序 闲话少说哈,上代码: 结果分析: (1)当随机数个数取值为10.100时,一般情况下,若冒泡排序的进程先调用,冒泡排序先完成,否则快速排序先完成(线程执行start()函数时并不能说明线程开始执行,只是加入了就绪队列,执不