1. 程式人生 > >Java陣列的高階部分:氣泡排序+選擇排序+直接插入排序+快速排序+折半查詢

Java陣列的高階部分:氣泡排序+選擇排序+直接插入排序+快速排序+折半查詢

1.氣泡排序

(1)氣泡排序的思想

      兩兩比較,大的往後放,第一次比較完畢之後,最大值就出現在了最大索引處!然後依次這樣比較,就可以得到一個排好序的陣列.

(2)氣泡排序的規律

 1)一定是兩兩比較,大的往後放,第一次比較完畢,最大值在最大索引處

 2)第一次全部都比較,確定陣列的最大值

  第一次比較,有0個元素不比

  第二次比較,有1個元素不比

  第三次比較,有2個元素不比

   ......

元素比較的次數:(陣列長度-1)次

(3)氣泡排序演算法

public static void BubbleSort(int[] arr) {
		for (int x = 0; x < arr.length - 1; x++) {
			for (int y = 0; y < arr.length - 1 - x; y++) {
				if (arr[y] > arr[y + 1]) {
					int temp = arr[y];
					arr[y] = arr[y + 1];
					arr[y + 1] = temp;
				}
			}
		}
	}

2.選擇排序

(1)選擇排序的思想

從0索引對應的元素依次和後面索引對應的元素進行比較,小的往前放,第一次比較完畢之後,最小值就出現在最小索引處,然後依次這樣比較,就可以得到一個排好序的陣列.

(2)選擇排序的規律

 1)從0索引開始依次和後面索引對應的元素進行比較,小的資料往前放,最小值在最小索引處.

 2)用0索引對應的值依次和後面索引對應的值比較

用1索引對應的值依次和後面索引對應的值比較

......

arr.length-2索引對應的元素和arr.length-1索引對應的值比較

(3)選擇排序演算法

// 選擇排序的功能
	public static void selectSort(int[] arr) {
		for (int x = 0; x < arr.length - 1; x++) {
			for (int y = x + 1; y < arr.length; y++) {
				if (arr[x] > arr[y]) {
					int temp = arr[x];
					arr[x] = arr[y];
					arr[y] = temp;
				}
			}
		}
	}

3.直接插入排序

(1)直接插入排序的思想

直接插入排序,是一種最簡單的排序方法.他的基本操作是將一個記錄插入到一個長度為m 的有序表中,使之仍保持有序,從而得到一個新的長度為m+1的有序列表.假設有一組元素{k1,k2...,kn},排序開始就認為k1是一個有序序列,讓k2插入上述表長為1的有序序列,使之成為一個表長為2的有序序列,然後讓k3插入上述表長為2的有序序列,使之成為一個表長為3的有序序列,以此類推,最後讓kn插入表長為n-1的有序序列,得到一個表長為n的有序序列.

(2)舉例

49,38,65,97,76,13,27  原始資料

[49],38,65,97,76,13,27

1引開始插入

[38,49], ,65,97,76,13,27

[38,49,65] 97,76,13,27

[38,49,65,97] 76,13,27

[38,49,65,76,97]13,27

[13,27,38,49,65,76,97],27

[13,27,38,49,65,76,97]

(3)直接插入排序演算法

private static void insertSort(int[] arr) {
        //外層迴圈 是迴圈的輪次
        for (int i = 1; i <= arr.length - 1; i++) {
            //當前元素,如果小於我前面的元素,交換位置
            int j = i;
            while (j > 0 && arr[j] < arr[j - 1]) {
                int t = arr[j];
                arr[j] = arr[j - 1];
                arr[j - 1] = t;
                j--;
            }
        }
    }

4.快速排序

(1)快速排序的基本思想

分治法:比大小,再分割槽

1.從陣列中取出一個數,作為基準數。

2.區:將比這個數大或等於的數全放到他的右邊,小於他的數 全放到他的左邊。

3.再對左右區間重複第二步,直到各區間只有一個數。

(2)實現思路

挖坑填數

1.將基準數挖出形成第一個坑。

2.由後向前找比他小的數,找到後挖出此數填到前一個坑中。

3.由前向後找比他大或等於的數,找到後也挖出此數填到前一個坑中。

4.再重複執行23兩步驟。

例如對 5391672408 進行排序

(3)快速排序演算法

public class QuickSort {
    //start 預設是0
    //end 是陣列長度-1
    public 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);//右半部分
        }
    }

    private int getIndex(int[] arr, int start, int end) {
        int i = start;
        int j = end;
        //定義基準數
        int x = arr[i];
        //迴圈
        while (i < j) {
            //從右往左比較
            while (i < j && arr[j] >= x) {
                j--;
            }
            //從右往左找到比基準數小的數了後,填坑
            if (i < j) {
                //把這個數填到上一個坑位
                arr[i] = arr[j];
                //讓 i++;
                i++;

            }

            //從左往右找
            while (i < j && arr[i] < x) {
                i++;
            }
            // 找比基準數大的數,找到後填坑
            if (i < j) {
                arr[j] = arr[i];
                j--;
            }
        }
        //當上面的迴圈結束後把基準數填到最後一個坑位,也就一基準數為界,分成了左右兩部分
        arr[i] = x; //把基準數填進去
        return i; //返回基準數所在位置的索引
    }

}

5.折半查詢

(1)前提:一定是陣列中的元素有序的!

(2)折半查詢的中心思想:

直接將陣列元素減半,方便開發者使用,計算出中心索引,大了左邊找,小了右邊找.

(3)核心思想:

   A:定義最小索引和最大索引
   B:計算中間索引
   C:中間索引對應的元素和需要查詢的元素比較
       相等,直接返回中間索引
       不相等:
              大了,左邊找  max = mid -1 ;
              小了,右邊找  min = mid + 1 ;
   D:重新計算中間索引 ,回到B繼續查詢

(4)折半查詢演算法

public static int search(int[] arr,int value) {
		//1)定義陣列中的最小索引和最大索引
		int min = 0 ;
		int max = arr.length -1 ;
		
		//2) 計算出中間索引
		int mid = (max+min)/2 ;
		
		//3)拿中間索引對應的元素和需要查詢的元素進行比較
		//如果相等,返回
		while(arr[mid]!=value) {
			//不相等
			if(arr[mid] >value) {
				 max = mid -1 ;
			}else {
				 min = mid + 1 ;
			}
			
			//如果這value在陣列中找不到,找不到返回-1
			if(min>max) {
				return -1 ;
			}
			
			//重新計算出中間索引
			mid = (max+min)/2 ;
		}
		return mid ;
	}

相關推薦

排序演算法(選擇、希爾、二分插入、冒泡、直接插入快速排序

public class BinarySearch1 { public static void main(String args[]) { int array[]={49,38,65,97,76,13,27}; binarySort(arra

Java陣列高階部分:氣泡排序+選擇排序+直接插入排序+快速排序+折半查詢

1.氣泡排序 (1)氣泡排序的思想       兩兩比較,大的往後放,第一次比較完畢之後,最大值就出現在了最大索引處!然後依次這樣比較,就可以得到一個排好序的陣列. (2)氣泡排序的規律  1)一定是兩兩比較,大的往後放,第一次比較完畢,最大值在最大索引處  2)第

Java中常見的陣列排序演算法(包括冒泡,選擇插入快速排序)

1 public static void bubbleSort(int[] arr) { 2 3    for(int x=0; x<arr.length-1; x++) { 4 5    for(int y=0; y<arr.length-x-

排序演算法(直接插入氣泡排序選擇排序快速排序、希爾排序、堆排序、歸併排序

main函式 int main() { int data[] = {1,2,6,3,4,7,7,9,8,5}; //bubble_sort(data,10); //select_sort(data,10); Insert_Sort(data,10); fo

Python三種排序演算法的執行速度對比(快速排序氣泡排序選擇排序)

最近看了一下快速排序演算法,據說速度比其他的排序演算法快,於是寫了三個排序演算法對比一下,分別是氣泡排序,快速排序,選擇排序,以下是三個排序演算法的程式碼: 氣泡排序   BubbleSort.py # -*- coding:utf8 -*- def Sort(list

java基礎-四種排序選擇/冒泡/直接插入/shell

import java.util.Arrays; /** * @Created with IntelliJ IDEA * @Description: 四種排序 * @Package: PACKAGE_NAME * @User: FLy * @Date: 2018/11/21

python排序(冒泡、直接選擇直接插入等)

時間 lec 改進 部分 urn 最後一個元素 穩定 等於 style 冒泡排序 冒泡法:第一趟:相鄰的兩數相比,大的往下沈。最後一個元素是最大的。 第二趟:相鄰的兩數相比,大的往下沈。最後一個元素不用比。 1 #冒泡排序 2 arra

(排序演算法)linux c語言實現快速排序氣泡排序的改進版)

 快速排序演算法是對氣泡排序演算法的一種改進,氣泡排序是對單個元素的升降,快速排序是對所有元素的升降,不過這個升降是取了某一個標準的前提下,在本文程式碼中,就以a[i],其實就是以最左邊的元素為參考,比較交換之後,將這個參考元素放到分界的地方,即i的位置。 程式碼如下,裡面有比較詳細的

php四種基礎演算法:冒泡,選擇插入快速排序法 程式碼練習

function maopao($arr,$len) { for($i=1;$i<$len;$i++) { for($j=0;$j<$len-$i;$j++) { if($arr[$j]>$arr[$j+1])

排序算法整理:冒泡排序、堆排序插入排序、歸並操作、快速排序、希爾排序選擇排序

不用 else if select 依次 r++ 一個 關系 break 不能 SortUtils.java package prms.utils.sort; import java.util.Arrays; /** * @ClassName: SortU

(資料結構排序的實驗四)快速,冒泡,簡單選擇直接插入排序的c語言實現!!

<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18p

找出陣列中第K個最小的數(快速排序

問題描述:給定一個無序的陣列,從一個數組中找出第K個最小的數,例如,對於給定陣列序列{1,5,2,6,8,0,6},其中第4小的數為5。 演算法思路:採用快速排序,分而治之的思想,根據主元,每次Partiton以主元為軸,比它小的數在左邊,比它大的數在右邊,判

排序演算法之直接插入排序的思想以及Java實現

1,基本思想 假設待排序的資料是陣列A[1….n]。初始時,A[1]自成1個有序區,無序區為A[2….n]。在排序的過程中,依次將A[i] (i=2,3,….,n)從後往前插入到前面已排好序的子陣列A

Python實現冒泡、選擇插入快速排序

ble style lec election 實現 class code quick i+1 1. 冒泡排序 # 冒泡排序 # 需比較len(seq)-1輪。每輪在下標0到len(seq)-i-1的數中,每一個數與它後面一個數比較,大數後移(冒泡),每輪中最大的數冒

java實現排序演算法之直接插入排序

直接插入排序思想將待排序陣列看成兩部分,一部分為已排好序,一部分為待排序,初始時已排序部分只有第一個元素。每次需將帶排序部分的第一個元素A(將該元素儲存在臨時變數中)與已排序的元素由後往前一一比較,如果元素A小於比較的元素B,則元素B後移一位,如果碰到元素A小於元素B則將元素

Go語言冒泡、選擇插入快速排序實戰淺析

Hello,各位小夥伴大家好,我是小棧君,今天為大家帶來的分享是關於go語言中的排序實戰淺析。 我們就實際操作關於go的氣泡排序、選擇排序、插入排序和快速排序四種方式的理論和實戰進行分享,希望能夠為大家在學習的路上帶來點啟發和經驗。 排序在我們平時的程式設計工作中時常可以見到,以按照不同的規則進行排序返回,以

排序算法<三>快速排序

排序算法 %d while cnblogs 快速 ace spa 算法 for #include<iostream> #include<cstdio> using namespace std; void swap(int arr[], int i,

C數據結構排序算法——直接插入排序法用法總結(轉http://blog.csdn.net/lg1259156776/)

所有 可能 app 必須 操作 itl 直接排序 works 技術分享 聲明:引用請註明出處http://blog.csdn.net/lg1259156776/ 排序相關的的基本概念 排序:將一組雜亂無章的數據按一定的規律順次排列起來。 數據表( data list)

排序算法-直接插入排序

log false clas ins class gen stat lin nbsp using System; using System.Collections.Generic; using System.Linq; using System.Text

數據結構(四十四)插入排序(1.直接插入排序 2.希爾排序

結束 縮小 移動 個數 數據 空間 分析 過程 只有一個   一、插入排序的基本思想   從初始有序的子集合開始,不斷地把新的數據元素插入到已排列有序子集合的合適位置上,使子集合中數據元素的個數不斷增多,當子集合等於集合時,插入排序算法結束。常用的 插入排序算法有直接插入排