常用排序(冒泡、快速、选择)

常见排序算法01


1、冒泡排序

冒泡排序思想是从头开始扫描待排序的元素,在这过程中相邻两个元素之间进行比较,将较大的数向后移,(即大数向下沉,小数向上冒),经过从头到尾的一次扫描后,当前最大的数就会被移动到最后一位了,然后记下这个位置,下一次扫描只需扫描到这个位置即可(即第i次扫描需要比较n-i次)。第i次扫描会将一个第i大的数排到倒数第i位上。

代码实现:

public void MPsort(){
    for (int i = 0; i < a.length; i++) {
       for (int j = 0; j < a.length-1-i; j++) {
          if(a[j]>a[j+1]){
            temp = a[j];
            a[j] = a[j+1];
            a[j+1] = temp;
        }
     }
   }
}

2、快速排序

快速排序思想是在所要排序的序列中找一个数作为基准数(pivot),一般选择所要比较的序列中第一个数,然后将比基准数大的放在基准数的右边,比基准数小的放在其左边。这样经过一次排序后,这个基准数的位置就会确定下来了。确定这个基准数后再对其左右两边的数分别做以上操作,最终即可确定所要数的位置了。

举例说明:(图片来源网上)
如图所示,有10位数组成的序列。设置两个哨兵,令哨兵i指向第一个元素,则6为当前基准数,令j指向最后一个元素。
这里写图片描述
首先令哨兵j开始向左移动,直至找到一个比基准数6小的数,如图找到数字5;然后哨兵i开始向右移动,直至找到一个比基准数6大的数,如图找到7.然后将5和7进行交换。
这里写图片描述
这里写图片描述
第一次交换结束后,j继续移动,找到4;i移动,找到9,将4和9进行交换。
这里写图片描述
这里写图片描述
最后,i和j在3的前面相遇,这时一次扫描完成,将基准数与3交换,此时基准数6的位置已经确定了。
这里写图片描述
这里写图片描述
在这之后,分别考虑6左边的序列3,1,2,5,4和其右边的序列9,7,10,8即可。(使用递归)

代码实现:

    public static void quicksort(int left,int right){
        int pivot = a[left];//基准数
        int i = left,j = right;
        int temp;

        if(i>=j){//只有一个元素做比较时
            return;
        }
        while(i!=j){
            //要先从右边开始,找小于pivot的数
            while(i<j&&a[j]>=pivot){
                j--;
            }
            //再找左边大于pivot的数
            while(i<j&&a[i]<=pivot){
                i++;
            }
            //交换
            if(i<j){
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
        //此时i,j相遇(i=j),则将基准与a[i]交换
        a[left] = a[i];
        a[i] = pivot;

        //使用递归,分别处理当前基准的左右两边
        quicksort(left,i-1);
        quicksort(i+1,right);
    }

3、 选择排序

在需要排序的序列中选出最小的元素,然后与第一个元素交换,接着在剩下的元素中选出最小的与第二个元素交换,以此类推。

代码实现:

    public void selectSort(){
        int position = 0,temp = 0;

        for (int i = 0; i < a.length; i++) {
            temp = a[i];
            position = i;//当前最小元素下标
            for (int j = i+1 ; j < a.length; j++) {
                if(a[j]<temp){
                    temp = a[j];
                    position = j;
                }
            }
            a[position] = a[i];
            a[i] = temp;
        }       
    }

猜你喜欢

转载自blog.csdn.net/kiddingboy_wjj/article/details/50809867
今日推荐