1. 程式人生 > >排序&二分查詢

排序&二分查詢

二分查詢

二分查詢演算法也稱為折半搜尋、二分搜尋
在有序陣列中查詢某指定元素的搜尋演算法。企業面試常見考試的型別。
* 有序:二分查詢法只適用於有序的陣列,對於無序的陣列如果想要使用二分查詢法查詢某資料,必須先對目標陣列進行排序。

  • 原理:二分查詢法,即對一個有序的陣列每次取陣列中間下標的資料與目標key值進行比較,快速縮小查詢範圍。
/**
 * 6,8,10,12,14,16,18,20--midVal = 12 > key
 * 6,8,10                --midVal = 8  < key
 * 10                    --midVal = 10 ==key 查詢成功
 */
public class Test01_BinarySearch { public static void main(String[] args) { int[] a = {6,8,10,12,14,16,18,20};// 測試陣列 int key = 10;// 目標key值 int index = binarySearch(a,key);// 使用我們寫的二分查詢法進行查詢 System.out.println("binarySearch:"+key+" index:"+index); int arrays = Arrays.binarySearch(a, key);// 呼叫Java官方提供的二分查詢法查詢資料
System.out.println("Arrays:"+key+" index:"+arrays); } private static int binarySearch(int[] a, int key) { int low = 0;// 記錄最小下標 int high = a.length-1;// 記錄最大下標 while(low <= high){// 當low > high時說明陣列中沒有查詢的key值 int mid = (low+high) >>> 1;// 計算中間下標
int midVal = a[mid];// 取得中間下標對應的值 if(midVal > key){// 將中間值與目標key值進行比較 high = mid-1;// 查詢範圍減半 }else if(midVal < key){ low = mid+1; }else{ return mid; } } return -1;// 查詢資料不存在 } }

排序

排序是計算機程式設計中的一種重要操作,是指將一個任意的序列,排列成一個關鍵字有序的序列。

選擇排序

  • 原理:每一趟從待排序的資料元素中選出最小(或最大)的一個元素,順序放在已排好序的數列的最後,直到全部待排序的資料元素排完。
public class Test02_SelectSort {
    public static void main(String[] args) {
        int[] a = new int[10];
        Random random = new Random();
        for(int i=0;i<a.length;i++){        
            a[i] = random.nextInt(100);
        }// 利用隨機數產生一個隨機陣列
        System.out.println(Arrays.toString(a));
        selectSort(a);// 排序
        System.out.println(Arrays.toString(a));

    }

    // 選擇排序,降序
    static void selectSort(int[] a){
        for(int i=0;i<a.length;i++){// 外層迴圈每一趟完成一個位置上資料的排序
            // 內層迴圈將該位置上的元素與其他所有元素進行比較,確定該位置上的元素,如第一次找到最大值放在第一個
            for(int j=i+1;j<a.length;j++){
                if(a[j]>a[i]){// 如果有元素大於該位置上的元素,就交換兩個元素
                    int t = a[i];
                    a[i] = a[j];
                    a[j] = t;
                }
            }
        }
    } 
}

氣泡排序

  • 原理:依次比較相鄰的兩個數,將小數放在前面,大數放在後面。升序
public class Test03_BubbleSort {
    public static void main(String[] args) {
        int[] a = new int[10];
        Random random = new Random();
        for(int i=0;i<a.length;i++){
            a[i] = random.nextInt(101);
        }
        System.out.println(Arrays.toString(a));

        bubbleSort(a);
        System.out.println(Arrays.toString(a));
    }

    // 氣泡排序
    static void bubbleSort(int[] a){
        for(int i=1;i<a.length;i++){
            for(int j=0;j<a.length-i;j++){// 內層迴圈迴圈一次選出一個最大的數放在陣列最後
                if(a[j] > a[j+1]){
                    int t = a[j];
                    a[j] = a[j+1];
                    a[j+1] = t;
                }
            }
        }
    }
}

插入排序

  • 原理:將資料插入到已經排好序的有序資料中,得到一個新的、個數加一的有序資料。
public class Test04_InsertSort {

    public static void main(String[] args) {
        int[] a = new int[10];
        Random random = new Random();
        for (int i = 0; i < a.length; i++) {
            a[i] = random.nextInt(101);
        }
        System.out.println(Arrays.toString(a));
        insertSort(a);
        System.out.println(Arrays.toString(a));
    }

    static void insertSort(int[] a) {
        for (int i = 1; i < a.length; i++) {
            int k = a[i];
            int j;
            for (j = i - 1; j >= 0 && k > a[j]; j--) {
                a[j + 1] = a[j];
            }
            a[j + 1] = k;
        }
    }
}

快速排序

快速排序的過程是首先選擇一個基準,如下標為0的數值。先從後往前找一個比基準大的數,然後將此數值與基準交換,再從前往後找一個比基準小的數值,然後在將此小數值與基準交換。如此反覆…
快速排序

  • 原理:快速排序使用分治法來設計演算法:取一個基準元素,拆分之後基準元素左邊的都比基準元素大,右邊的元素都比基準元素小,然後分別對兩個子陣列排序。降序
public class Test05_QuickSort {
    public static void main(String[] args) {
        int[] a = new int[10];
        Random random = new Random();
        for(int i=0;i<a.length;i++){
            a[i] = random.nextInt(100);
        }
        System.out.println(Arrays.toString(a));

        quickSort(a,0,a.length-1);
        System.out.println(Arrays.toString(a));
    }

    private static void quickSort(int[] a, int low, int high) {
        if(low>=high){// 遞迴的中止條件
            return;
        }
        int l = low;
        int h = high;
        boolean isRight = false;
        while(l < h){
            if(a[l] < a[h]){
                int t = a[l];
                a[l] = a[h];
                a[h] = t;
                isRight = !isRight;
            }
            if(isRight){
                l++;
            }else{
                h--;
            }
        }
        quickSort(a,low,l-1);// 對子陣列進行排序
        quickSort(a,l+1,high);
    }
}

相關推薦

插入排序——二分查詢排序(BinarySearchSort)

原理:首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢成功,或直到

面試中常見的陣列的操作:遍歷,最值,反轉,氣泡排序,二分查詢(附程式碼)

陣列:儲存同一種資料型別的多個元素的容器;陣列中的索引從0開始,最大編號是陣列的長度-1(減1); 下面給大家列出陣列常見的幾種操作:     A 遍歷   /** * 遍歷 */ public static void printArray(int

氣泡排序 二分查詢

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; u

Java:氣泡排序 | 二分查詢

1 public static int[] bubbleSort(int[] intArr) { 2 if (intArr == null) 3 return null; // 當傳進來的陣列為null時返回null 4 int len

this指向氣泡排序二分查詢

12.10 解決函式內this指向 可以在函式外提前宣告變數 _this/that=this 通過apply和call 來修改函式內的this指向 (1) 二者區別 用法是一樣的,就是引數形式不一樣  fn.call(obj,a,b)/fn.apply(obj,[a,

排序&二分查詢

二分查詢 二分查詢演算法也稱為折半搜尋、二分搜尋 在有序陣列中查詢某指定元素的搜尋演算法。企業面試常見考試的型別。 * 有序:二分查詢法只適用於有序的陣列,對於無序的陣列如果想要使用二分查詢法查詢某資料,必須先對目標陣列進行排序。 原理:二分查詢法,即

leetcode 刷題題解(c++) 1.Two Sum (hash表,排序+二分查詢

題目描述: Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return i

氣泡排序、選擇排序二分查詢、插入排序

氣泡排序、選擇排序、二分查詢、插入排序 氣泡排序   氣泡排序的思想就是兩兩比較,按從小到大輸出的話,兩個值相比,較小的放前大的放後,那麼第一次兩兩比較結束後,最大值放在末尾,接下來再繼續兩兩比較,但是這一次不需要比較到最後,因為最後已經是最大值了,所以每次兩兩比較結束後,都會少比一次,

lintcode 106. 排序列表轉換為二分查詢

題目:給出一個所有元素以升序排序的單鏈表,將它轉換成一棵高度平衡的二分查詢樹 思路:每次取一箇中間元素,遞迴。 class Solution {public:     /*      * @param head: The

javascript常用陣列排序二分查詢

1. 氣泡排序 基本思路:依次比較相鄰的兩個數的大小,若大數在前、小數在後,則交換兩個數的位置,依次比較直至全部資料從小到大排好序 function sort_bubble(arr) { var len = arr.length; for (var i = 0;

二分查詢和快速排序(應該不能執行,只是一些筆記)

#include<iostream> using namespace std; template<class Type> //二分查詢 int BinarySearch(Type a[],const Type& x,int l,int r) {//a[]排好的遞

js實現快速排序二分查詢 (詳解,一次學會)

js中幾大演算法,最近看到網上各路大神的解答,都蠻好的,自己也來玩一玩 一,快速排序 大致分三步: 在資料集之中,選擇一個元素作為"基準"(pivot)。 所有小於"基準"的元素,都移到"基準"的左邊;所有大於"基準"的元素,都移到"基準"的右邊。 對"基準"左邊和右邊的兩個子集,不斷重複

【JS】 尋找旋轉排序陣列中的最小值 #陣列 #二分查詢

假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。 ( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。 請找出其中最小的元素。 你可以假設陣列中不存在重複元素。 示例 1: 輸入: [3,4,5,1,2] 輸出: 1 示例

【JS】搜尋旋轉排序陣列 II #陣列 #二分查詢

假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。 ( 例如,陣列 [0,0,1,2,2,5,6] 可能變為 [2,5,6,0,0,1,2] )。 編寫一個函式來判斷給定的目標值是否存在於陣列中。若存在返回 true,否則返回 false。 示例 1: 輸入: nums

【JS】 搜尋旋轉排序陣列 #陣列 #二分查詢

假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。 ( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。 搜尋一個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 -1 。 你可以假設陣列中不存在重複的元素。 你的

【JS】兩個陣列的交集 II #排序 #雜湊 #雙指標 #二分查詢

給定兩個陣列,編寫一個函式來計算它們的交集。 示例 1: 輸入: nums1 = [1,2,2,1], nums2 = [2,2] 輸出: [2,2] 示例 2: 輸入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] 輸出: [4,9] 說明: 輸出結

【JS】 兩個陣列的交集 #排序 #雜湊 #雙指標 #二分查詢

給定兩個陣列,編寫一個函式來計算它們的交集。 示例 1: 輸入: nums1 = [1,2,2,1], nums2 = [2,2] 輸出: [2] 示例 2: 輸入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] 輸出: [9,4] 說明: 輸出結果中

二分查詢、快速排序、遞迴呼叫的分析

常見的基礎演算法,相信大家見過很多。接下來我來分析下二分查詢、和快速排序演算法。 二分查詢: 前提是在已經排好序的陣列中,通過查詢的元素與中間元素索引值對應的元素進行比較,若大於中間索引值的元素,則向陣列右半部分查詢元素。依次類推,直到找到為止;找不到就返回一個負數; 二分查詢的時間複雜

Python排序二分查詢

import random def bubbleSort(arr): for i in range(0, len(arr)): for j in range(0, len(arr)-1-i): if arr[j] > arr[j+1]: arr[j], arr[j+1]

二分查詢排序

1、定義 二分查詢又稱折半查詢,它是一種效率較高的查詢方法。 二分查詢要求:線性表是有序表,即表中結點按關鍵字有序,並且要用向量作為表的儲存結構。不妨設有序表是遞增有序的。 2、基本思想 二分查詢的基本思想是:     設R[low..high]是當前的查