天天看點

2020.7.30數組排序(1)01_數組排序

01_數組排序

01.1_定義

把數組無序的元素通過交換移動等方式使數組或元素變成有序序列。

01.2_冒泡排序

數組中的元素兩兩比較大的元素往後放,經過一輪比較後,最大的元素會出現在最後面。

2020.7.30數組排序(1)01_數組排序

案例示範

package ArraryDemo1;

import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;

import java.util.Arrays;

//冒泡排序
public class ArrayTest01 {
    public static void main(String[] args) {
        //定義一個數組
        int[] arr = {5, 10, 7, 4, 3};
        //抽取方法
        // chang(arr);
        for (int j = 0; j < arr.length - 1; j++) {
            for (int i = 0; i < arr.length - 1-j; i++) {
                if (arr[i] > arr[i + 1]) {
                    //互換位置
                    int x = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = x;
                }
            }
        }
        System.out.println(Arrays.toString(arr));//[3, 4, 5, 7, 10]
        System.out.println("--------------------------------------------");
    }
    //将分輪比較提取為方法
    private static void chang(int[] arr) {
        //進行第一輪排序
        for (int i = 0; i < arr.length - 1; i++) {
            if (arr[i] > arr[i + 1]) {
                //互換位置
                int x = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = x;
            }
        }
        //輸出數組元素
        System.out.println(Arrays.toString(arr));//[5, 7, 4, 3, 10]
        System.out.println("---------------");
        //進行第二輪排序
        for (int i = 0; i < arr.length - 1 - 1; i++) {
            if (arr[i] > arr[i + 1]) {
                //互換位置
                int x = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = x;
            }
        }
        //輸出數組元素
        System.out.println(Arrays.toString(arr));//[5, 4, 3, 7, 10]
        System.out.println("---------------");
        //進行第三輪排序
        for (int i = 0; i < arr.length - 1 - 1 - 1; i++) {
            if (arr[i] > arr[i + 1]) {
                //互換位置
                int x = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = x;
            }
        }
        //輸出數組元素
        System.out.println(Arrays.toString(arr));//[4, 3, 5, 7, 10]
        System.out.println("-------------");
        //進行第三輪排序
        for (int i = 0; i < arr.length - 1 - 1 - 1 - 1; i++) {
            if (arr[i] > arr[i + 1]) {
                //互換位置
                int x = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = x;
            }
        }
        //輸出數組元素
        System.out.println(Arrays.toString(arr));//[3, 4, 5, 7, 10]
    }
}

           

01.3_選擇排序

  1. 每次拿一個元素,跟後面剩餘的元素比較,挨個比較,小的往前方,最小的元素就會出現在最前面
    2020.7.30數組排序(1)01_數組排序

案例示範

package ArraryDemo1;

import java.util.Arrays;

//選擇排序
public class ArrayTest02 {
    public static void main(String[] args) {
        //定義一個數組
        int[] arr={5,10,7,4,3};
        //chang(arr);
        //選擇排序
        for (int j = 0; j < arr.length; j++) {
            for (int i = 1+j; i < arr.length; i++) {
                if(arr[j]>arr[i]){
                    int y=arr[j];
                    arr[j]=arr[i];
                    arr[i]=y;
                }
            }
        }
        System.out.println(Arrays.toString(arr));//[3, 4, 5, 7, 10]
        System.out.println("============================================================");
    }

    private static void chang(int[] arr) {
        int x=0;
        for (int i = 1; i < arr.length; i++) {
            if(arr[x]>arr[i]){
                int y=arr[x];
                arr[x]=arr[i];
                arr[i]=y;
            }
        }
        System.out.println(Arrays.toString(arr));//[3, 10, 7, 5, 4]
        System.out.println("--------------------------------");
        //選擇排序第二輪,開始比較元素索引為1,比上一輪少比較一次
        x=1;
        for (int i = 2; i < arr.length; i++) {
            if(arr[x]>arr[i]){
                int y=arr[x];
                arr[x]=arr[i];
                arr[i]=y;
            }
        }
        System.out.println(Arrays.toString(arr));//[3, 4, 10, 7, 5]
        System.out.println("--------------------------------");
        //選擇排序第三輪,開始比較元素索引為2,比上一輪少比較一次
        x=2;
        for (int i = 3; i < arr.length; i++) {
            if(arr[x]>arr[i]){
                int y=arr[x];
                arr[x]=arr[i];
                arr[i]=y;
            }
        }
        System.out.println(Arrays.toString(arr));//[3, 4, 5, 10, 7]
        System.out.println("--------------------------------");
        //選擇排序第四輪,開始比較元素索引為3,比上一輪少比較一次
        x=3;
        for (int i = 4; i < arr.length; i++) {
            if(arr[x]>arr[i]){
                int y=arr[x];
                arr[x]=arr[i];
                arr[i]=y;
            }
        }
        System.out.println(Arrays.toString(arr));//[3, 4, 5, 7, 10]
        System.out.println("--------------------------------");
    }
}

           

01.4_直接插入排序

  • 從第二個元素,每次那一個元素插入之前的序列中,使之仍保持有序

案例示範:

package ArraryDemo1;

import java.util.Arrays;

//直接插入排序:從第二個元素,每次拿一個後面元素插入之前的有序列中,使之仍保持有序
public class ArrayTest03 {
    public static void main(String[] args) {
        //[4,8,2,43,9,-8]
        //[]
        //
        int[] arr = {49, 38, 5, 97, 76, 13, 27, 20, 36, 58, 95};
        //外層循環定義輪次
        for (int i = 1; i < arr.length; i++) {
            for (int j = i; j >0 ; j--) {
                if(arr[j]<arr[j-1]){
                    int x=arr[j];
                    arr[j]=arr[j-1];
                    arr[j-1]=x;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
        System.out.println("=============================================");
        for (int k = 0; k < arr.length; k++) {
            int y=k;
            while(y>0&&arr[y]<arr[y-1]){
                int x=arr[y];
                arr[y]=arr[y-1];
                arr[y-1]=x;
            }
            y--;
        }
        System.out.println(Arrays.toString(arr));
    }
}
           

01.5_快速排序

分治法:比大小,再分區
從數組中取出一個數,作為基準數。
分區:将比這個數大或等于的數全放到他的右邊,小于他的數
全放到他的左邊。
再對左右區間重複第二步,直到各區間隻有一個數。

------------------------------思路
挖坑填數
将基準數挖出形成第一個坑。
由後向前找比他小的數,找到後挖出此數填到前一個坑中。
由前向後找比他大或等于的數,找到後也挖出此數填到前一個坑中。
再重複執行2,3兩步驟。

           
2020.7.30數組排序(1)01_數組排序

案例示範

對第一輪進行實作;

package ArraryDemo1;

import java.util.Arrays;

//快速排序
public class QuickScortTest {
    public static void main(String[] args) {
        //定義一個數組

        int[] arr = {5, 3, 9, 1, 6, 7, 2, 4, 0, 8};

        int i = 0;
        int j = arr.length - 1;
        //定義一個基準數
        int x = arr[0];
        //由後向前找比他小的數,找到後挖出此數填到前一個坑中。
        while(i<j){
            while (i < j && arr[j] >= x) {
                j--;
            }
            if (i < j) {
                arr[i] = arr[j];
                i++;
            }
            //由前向後找比他大或等于的數,找到後也挖出此數填到前一個坑中。
            while (i < j && arr[i] < x) {
                i++;
            }
            if (i < j) {
                arr[j] = arr[i];
                j--;
            }
            //把基準數鐵道最後一個坑中
            arr[i] = x;

            System.out.println(Arrays.toString(arr));
        }
        //一輪輸出
       /*   [0, 3, 5, 1, 6, 7, 2, 4, 9, 8]
            [0, 3, 4, 1, 5, 7, 2, 6, 9, 8]
            [0, 3, 4, 1, 2, 5, 7, 6, 9, 8]//第一輪最終結果*/

    }
}
           

整體實作,并封裝方法

package ArraryDemo1;

import java.util.Arrays;

public class QuicjkScortTest02 {
    public static void main(String[] args) {
        int[] arr={5,3,9,1,6,7,2,4,0,8};
        //調用方法
        QuicjkScortTest01.QuickSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));//[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    }
}
------------------------------------------------------------------------
package ArraryDemo1;

import java.util.Arrays;

//快速排序
public class QuicjkScortTest01 {

    public QuicjkScortTest01() {
    }

    //用遞歸進行實作,調用方法
    public static void QuickSort(int[] arr,int start,int end){
        if(start<end){
            //取出分區的索引
            int index=getIndex(arr,start,end);
            //對左分區進行遞歸
            QuickSort(arr,start,index-1);
            //對右分區進行遞歸
            QuickSort(arr,index+1,end);
        }

    }
    //封裝方法
    public static int getIndex(int[] arr,int start,int end){
        int i=start;
        int j=end;
        //定義一個基準數
        int x=arr[i];
        while(i<j){
            //由後向前找比他小的數,找到後挖出此數填到前一個坑中
            //隻要沒有找到比基準數小的就一直向前找,但是不能超出索引i
            while (i < j && arr[j] >= x) {
                j--;
            }
            if (i < j) {
                arr[i] = arr[j];//将找到的數填在前一個坑中
                i++;
            }
            //由前向後找比他大或等于的數,找到後也挖出此數填到前一個坑中。
            while (i < j && arr[i] < x) {//隻要沒有找到比基準數大的就一直向後找,但是不能超出索引j
                i++;
            }
            if (i < j) {
                arr[j] = arr[i];//将找到的數填在前一個坑中
                j--;
            }
           // System.out.println(Arrays.toString(arr));
        }
        //把基準數鐵道最後一個坑中
        arr[i] = x;
        return i;//傳回的是下一輪分區的索引
    }
}