排序&二分查詢
二分查詢
二分查詢演算法也稱為折半搜尋、二分搜尋
在有序陣列中查詢某指定元素的搜尋演算法。企業面試常見考試的型別。
* 有序:二分查詢法只適用於有序的陣列,對於無序的陣列如果想要使用二分查詢法查詢某資料,必須先對目標陣列進行排序。
- 原理:二分查詢法,即對一個有序的陣列每次取陣列中間下標的資料與目標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]是當前的查