java排序(3):交换类排序

一.冒泡排序

1.基本思想

 冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

2.思路

核心:两两比较(交换)
(1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。
(2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
(3)针对所有的元素重复以上的步骤,除了最后一个。
(4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

这里写图片描述

3.代码

public static void bubbleSort(int[] numbers) {
    //从小到大 从第一个开始
    //
    for(int i=0;i<numbers.length;i++){

        for(int j=0;j<numbers.length-i-1;j++){
            if(numbers[j]>numbers[j+1]){
                int temp  = numbers[j];                 
                numbers[j] = numbers[j+1];
                numbers[j+1] = temp;                    
            }
        }
    }
    for (int k:numbers) {
         System.out.println(k);
    }

}

测试:

 int[] arr = {8,7,9,1,3,2,4,5,6};
 MySorts.bubbleSort(arr);

结果:

1 2 3 4 5 6 7 8 9 

4.优缺点

(1)优点

比较简单,空间复杂度较低,是稳定的

(2)缺点

时间复杂度太高,效率不好

二.快速排序

1.基本思想

快速排序的原理:选择一个关键值作为基准值。比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的)。一般选择序列的第一个元素。
一次循环:从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果没有继续比较下一个,直到找到第一个比基准值小的值才交换。找到这个值之后,又从前往后开始比较,如果有比基准值大的,交换位置,如果没有继续比较下一个,直到找到第一个比基准值大的值才交换。直到从前往后的比较索引>从后往前比较的索引,结束第一次循环,此时,对于基准值来说,左右两边就是有序的了。

2.思路

(1) 首先在数组中选择一个基准点pivot(一般以数组第一个元素pivot,pivot= arr[i],此时数组i位置的值arr[i]可以覆盖)
(2)从数组右端开始扫面数组(i=low, j=high),比pivot大的排在右边(不做操作),继续扫描(j–)

(3)从右边扫描到比pivot小的, 覆盖位置为i的值(arr[i]=arr[j],第1步知数组i位置的值arr[i]可以覆盖), 从左边开始扫描
(4)从数组左端开始扫面数组,比pivot小的排在左边(不做操作),继续扫描(i++)
(5)从左边扫描到比pivot大的,覆盖位置为j的值(arr[j]=arr[i],第3步知数组j位置的值arr[j]可以覆盖)
(6)一直重复执行以上操作2-5直至i=j,将最终pivot的值赋给arr[i]
(7)对最终pivot所在位置左边子数组和右边字数组递归执行以上操作1-6

这里写图片描述

3.代码

/**
  * 方法名:QuickSort
  * 详述:快速排序  从小到大排序
  * 核心思想:定义一个支撑点pivotkey(一般以数组第一个为pivot),小于的排左边,大于的排右边
  * 
  */

 public static void QuickSort(int numbers[],  int low, int high){
    int i = low;
    int j = high;
    int pivot = numbers[i];
    do{
        while((numbers[j]>=pivot) && (j>i)) 
            j--; 
        numbers[i] = numbers[j];
        while((numbers[i]<=pivot) && (i<j))
            i++;
        numbers[j] = numbers[i];

    }while(i<j);
    numbers[i] = pivot;
    if(i>low) QuickSort(numbers, low, i-1);
    if(i<high) QuickSort(numbers, i+1, high);
 }

测试:

@Test
public void testQuickSort(){
    int[] numbers = {1,3,10,5,18,9,10,2,6,8,7};
    AllSorts.QuickSort(numbers,0,10);
    AllSorts.printArr(numbers);
}

结果:

1 2 3 5 6 7 8 9 10 10 18 

4.优缺点

快速排序在序列中元素很少时,效率将比较低,不然插入排序,因此一般在序列中元素很少时使用插入排序,这样可以提高整体效率。

三.参考

http://www.cnblogs.com/0201zcr/p/4763806.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值