交换类排序(冒泡排序及快速排序)

来源:互联网 发布:淘宝网店图片处理软件 编辑:程序博客网 时间:2024/06/06 03:28

交换类排序算法的基本思想是:对带排序记录的关键字两两比较,只要发现两个记录为逆序就进行交换,直到没有逆序为止
一.冒泡排序
冒牌排序也叫相邻比较法,即在扫描带排序记录序列是,顺次比较两个记录的关键字大小,如果逆序就交换记录
动画示意(此处用http://blog.csdn.net/wall1999/article/details/55192744中的动图)
这里写图片描述

```//这里是c语言的实现,js也可以用,思想相同,稍微改动即可void BubbleSort(RecordList L){    flag=1;    for(i=0;i<=L.length-1&&flag;i++)//只有flag为1才排序    {        flag=0;        for(j=0;j<L.length-i;j++)//注意此处为length-i,前面排过序的不必在排,去掉他们        {          if(L.r[j].key>l.r[j+1].key)//如果前一个数大于后面的数就交换位置,因此此处是升序排序           {            t=L.r[j];            L.r[j]=L.r[j+1];            L.r[j+1]=t;            flag=1;              }        }     } }```由上述代码可以看出,如果不需要排序,则flag不会由0改为1,因此外层循环判断不成立,不再排序。**时间复杂度:最好的情况下已经为正序,那么外层循环只进行1次就结束整个过程,最小时间代价为O(n),但最差情况下,外层循环要进行n-1次,每一次外层循环控制内层循环进行n-1次,所以为O(n^2)**

二.快速排序
数据结构中描述快速排序的基本思想为:从带排序序列中任选一个作为‘枢轴’,小于枢轴的移动在枢轴前,大于的移动到枢轴后,一趟排序后无序序列被分为左右两个子序列,然后分别对分隔所得的子序列递归地进行快速排序,以此类推,直到每个子序列只含有一个记录为止。

  function QKSort(myArr){            // 如果只有一位,就没有必要比较            if(myArr.length<=1){                return myArr;            }            // 获取中间值的索引            var len = Math.floor(myArr.length/2);            // 截取中间值            var cur = myArr.splice(len,1)[0];//从中间值的位置删除一项,即把中间值从原数组中提出来,并复制给cur,因为splice会返回一个包含被删除项的数组            // 小于中间值放这里面            var left = [];            // 大于的放着里面            var right = [];            for(var i=0;i<myArr.length;i++){                // 判断是否大于                if(cur>myArr[i]){                    left.push(myArr[i]);                }else{                    right.push(myArr[i]);                }            }            // 通过递归,上一轮比较好的数组合并,并且再次进行比较。            return QKSort(left).concat(cur,QKSort(right));        }