1. 程式人生 > >幾種基礎的排序方法

幾種基礎的排序方法

寫排序demo要在test裡新建class 不是在main裡
在這裡插入圖片描述
想要在控制檯列印 需要加test註解
在這裡插入圖片描述

氣泡排序
package com.jia.mysort;

import org.junit.Test;
/**
 * 氣泡排序
 */
public class MyBubble {
    @Test
    public void bubbleSort(){
        //定義一個數組
        int []source = {2,8,6,1,9,4,5};
        //外層,用於記錄和控制第幾輪迴圈
        for (int i = 0; i < source.length-1; i++) {
            //內層,用於控制每輪迴圈的次數
            for (int j = 0; j < source.length-1-i; j++) {
                //如果前面的數大於後面的數,則交換位置
                if(source[j]>source[j+1]){
                    int temp = source[j];
                    source[j]=source[j+1];
                    source[j+1]=temp;
                }
            }
        }
        //迴圈輸出
        for (int i = 0; i < source.length; i++) {
            System.out.print(source[i]+"     ");
        }
    }

}

簡單選擇排序
package com.jia.mysort;

import org.junit.Test;

public class MySelect {
    @Test
    /**
     * 簡單選擇排序
     */
    public void selectSort(){
        int []source = {5,2,1,3,6,4,9};
        //外層,用於控制第幾輪迴圈
        for (int i = 0; i < source.length - 1; i++) {
            // 內層,用於控制每輪迴圈次數
            for (int j = i+1; j < source.length; j++) {
                //如果第i個數大於後面的數,則交換位置
                if(source[i]>source[j]){
                    int temp = source[i];
                    source[i] = source[j];
                    source[j] = temp;
                }
            }
        }
        for (int i = 0; i < source.length; i++) {
            System.out.print(source[i]+"    ");
        }
    }

}

二分法查詢
一定要是在排好序的情況下進行查詢
在test裡寫demo時要用system.out.print進行輸出 而不是用log列印

package com.jia.mysort;

import android.util.Log;

import org.junit.Test;
/**
 * 二分法查詢
 * @return
 */
public class MyDichotomy {
    @Test
    public void twoPointQuery(){
        int []source = {1,2,3,4,5,6};
        int num = 5;//查詢5的索引
        int start = 0;//查詢的起始角標
        int end = source.length-1;//查詢的結尾角標
        int mid = (start+end)/2;//查詢的中間角標
        while (num!=source[mid]){
            if(source[mid]>num){
                end = mid-1;
            }else if (source[mid]<num){
                start = mid+1;
            }
            //防止死迴圈
            if(start>end){
                mid = -1;// -1代表沒有這個數字
                break;
            }
            mid = (start + end)/2;
        }
        // 迴圈結束的時候,mid的值即為要查詢的角標值
        System.out.print("要查詢的num的角標為:"+mid);
    }

}

快速排序

package com.jia.mysort;

import org.junit.Test;

public class MyQuick {
    @Test
    public void quick(){
        int[] list = {6, 1, 2, 7, 9, 3, 4, 5, 10, 8};
        System.out.println("************快速排序************");
        System.out.println("排序前:");
        display(list);

    System.out.println("排序後:");
    quickSort(list, 0, list.length - 1);
    display(list);
}

/**
 * 快速排序演算法
 */
public static void quickSort(int[] list, int left, int right) {
    if (left < right) {
        // 分割陣列,找到分割點
        int point = partition(list, left, right);

        // 遞迴呼叫,對左子陣列進行快速排序
        quickSort(list, left, point - 1);
        // 遞迴呼叫,對右子陣列進行快速排序
        quickSort(list, point + 1, right);
    }
}

/**
 * 分割陣列,找到分割點
 */
public static int partition(int[] list, int left, int right) {
    // 用陣列的第一個元素作為基準數
    int first = list[left];
    while (left < right) {
        while (left < right && list[right] >= first) {
            right--;
        }
        // 交換
        swap(list, left, right);

        while (left < right && list[left] <= first) {
            left++;
        }
        // 交換
        swap(list, left, right);
    }
    // 返回分割點所在的位置
    return left;
}

/**
 * 交換陣列中兩個位置的元素
 */
public static void swap(int[] list, int left, int right) {
    int temp;
    if (list != null && list.length > 0) {
        temp = list[left];
        list[left] = list[right];
        list[right] = temp;
    }
}

/**
 * 遍歷列印
 */
public static void display(int[] list) {
    System.out.println("********展示開始********");
    if (list != null && list.length > 0) {
        for (int num : list) {
            System.out.print(num + " ");
        }
        System.out.println("");
    }
    System.out.println("********展示結束********");
}

}