算法学习笔记 第1章 排序

来源:互联网 发布:sql不区分大小写查询 编辑:程序博客网 时间:2024/06/13 01:43

目录:

        • 冒泡排序
        • 桶排序
        • 快速排序

第1章主要讲了桶排序,冒泡排序和快速排序。
+ 桶排序最快最简单,冒泡排序是入门级排序,快速排序是最常用的排序。
+ 时间复杂度:桶排序O(N+M),快速排序O(NlogN),冒泡排序O(N^2)。

冒泡排序

  • 冒泡排序的基本思想:每次比较两个相邻的元素,如果它们的顺序错误(与我们设定的不同)就将它们交换过来。
  • 如果是从大到小排序,就是越小的越靠后。
  • 冒泡排序代码的核心部分是双重嵌套循环。
  • 冒泡排序的步骤:
    • 如果有n 个数进行排序,只需将n-1 个数归位,也就是说要进行n-1 趟操作;
    • 而“每一趟”都需要从第1 位开始进行相邻两个数的比较,将较小的一个数放在后面,比较完毕后向后挪一位继续比较下面两个相邻数的大小;
    • 重复此步骤,直到最后一个尚未归位的数,已经归位的数则无需再进行比较。
  • 冒泡排序代码演示:
import java.util.Arrays;import java.util.Random;/** * <p>Description:冒泡排序算法</p> * <p>2016年8月5日 下午5:16:35</p> * @author  wdk * @version 1.0 */public class BubbleSort {    private final static int  LENGTH = 10;//数组长度    private final static int  BOUND = 1000;//随机数边界值[0,BOUND)    public static void main(String[] args) {        Random random = new Random();        int[] arr = new int[LENGTH];        for (int i = 0; i < arr.length; i++) {            arr[i] = random.nextInt(BOUND);        }        System.out.println("排序前:"+Arrays.toString(arr));        System.out.println("用冒泡排序(从大到小排列):");        long beginTime = System.currentTimeMillis();        bubbleSort(arr);//冒泡排序算法        System.out.println("排序后:"+Arrays.toString(arr));        long endTime = System.currentTimeMillis();        System.out.println("冒泡排序耗时:"+(endTime- beginTime)+"ms");    }    /**     *  冒泡排序算法     * @param arr     */    static void bubbleSort(int[] arr){        for (int i = 0; i < arr.length - 1; i++) {            for (int j = 0; j < arr.length - i -1; j++) {                if(arr[j] < arr[j+1]){                    int temp = arr[j];                    arr[j] = arr[j+1];                    arr[j+1] = temp;                }            }        }    }}

桶排序

  • 桶排序的步骤:
    • 需要排序多少个数,就申请多少个数组(“桶”)。
    • 扫描全部的数,每遇到与数组索引(就是arr[index]中的index)相同的,则该值(arr[index])加1。
    • 再遍历数组打印所有的值。从小到大用for(i=0;i<=10;i++) 从大到小用for(i=10;i>=0;i–)

快速排序

  • 思想:
    • 需要将这个序列中所有比基准数大的数放在基准数的右边,比基准数小的数放在基准数的左边。
    • 目标就是将基准数移到中间的某个位置(设为k),寻找位置k,使得以第k位为分界点,左边数小于基准数,右边数大于基准数。
  • 步骤
    1. 在序列中随机找一个基准数(例如最左边的数);
    2. 设定2个”哨兵” i 和 j,分别指向序列的最左边和最右边;
    3. 先让j不断向左移动(j–),找到小于基准数的数时停下来;再让i不断向右移(i++),找到大于基准数的数时停下来。
    4. 现在交换i和j所指向的值,第一次交换结束;
    5. 重复步骤3,4直至i与j碰头,将该指向值与基准数交换,则基准数位于分界点(第k位)位置,至此完成第一次分界点的寻找;
    6. 再分别对分界点左右序列,重复以上所有步骤,完成后续分界点的寻找,直至排序完成。
1 0