day05 插入,歸併,快速,選擇排序演算法總結

2021-09-25 19:02:02 字數 3071 閱讀 5404

前面幾天在學習基礎的排序演算法,從o(n²)級別到o(n)級別的演算法,今天就不學習新的排序演算法了,停下來把之前學習的進行鞏固一下,並且好好分析一下這幾種演算法之間的區別,以及他們分別適用於什麼樣的情景。

選擇排序的思想正如它的名字,重點就在選擇。怎麼個選擇法呢?

選擇排序會從當前陣列中,每次選出乙個最小的數字放在最前方。第一次遍歷選擇出乙個最小的,第二次遍歷選擇出乙個第二小的,以此類推,每次遍歷,無序的元素就逐漸減少,當剩下最後乙個元素時,整個陣列就處在了乙個有序的狀態。

選擇排序很簡單,是屬於o(n²)級別的排序演算法,時間效率也是不如人意,但是它的特點就是簡單,在一些情況下我們不需要去考慮資源的問題,那麼我們就可以使用這種排序演算法,因為我們不需要去花費太多的時間去設計演算法。

話不多說直接上**:

private static void selectsort(int  arr) 

}sorttesthelper.swap(arr, i, minindex);

} }

選擇排序的重點是選擇,那麼插入排序的重點當然是插入了啦。具體怎麼實現呢?

遍歷陣列,讓需要插入的元素依次與它前面的數字進行比較,直到找到乙個合適的位置。那麼什麼是合適的位置呢?那就是當它發現它前面的元素比它小的時候,這時候這個位置就是合適的了。如果它前面的元素比它大,那就交換位置,然後繼續和前面的元素進行比較。

話不多說,直接上**:

private static void insertsort(int  arr) else 

}arr[j] = value;

} }

歸併排序是一種遞迴排序的演算法,什麼是遞迴呢?說簡單點就是自己呼叫自己,說的複雜點就是不斷的壓棧和出棧,這不是我們現在討論的重點,有興趣的同學可以自己去搜尋相關的資料。

歸併排序其實分為兩個過程,乙個是分割,另外乙個就是排序。

先是將整個陣列不斷等份分割(這裡的等分指的是除以二,兩個部分不一定等長),當分成最小等分後。就進行第二個步驟,就是歸併,自底向上進行合併。

廢話不多說,直接上**:

這裡溫馨提醒一波,排序演算法一定要注重邊界問題,必須明白自己的邊界才能準確的進行排序。

private static void mergesort(int  arr ,int left,int right) 

int mid = (right - left)/2 + left;

mergesort(arr,left,mid);

mergesort(arr,mid+1,right);

merge(arr,left,right,mid);

} private static void merge(int arr,int left ,int right,int mid) else if(j > right)

if(arr[i] < arr[j]) else

} int index = left;

while(index <= right)

}

快速排序和歸併排序都是o(n)級別的排序演算法,也是現在最重要的排序演算法之一,希望大家都能熟練掌握這種排序演算法。

快排其實分為好幾種,分別是:基礎快排,二路快排,三路快排

幾種排序在前邊的部落格我都有詳解,這裡就不過多贅述了,有興趣的小夥伴可以參考我之前的部落格。快排的思想就是將乙個數通過操作,放到它排好序後應該放在的位置上,然後再去排其他的數字。

* 雙路排序是兩個索引,所以三路排序就是三個索引了

* 所以我們這次返回的就是等於參考值的區間,我們返回乙個陣列,陣列中儲存兩個元素,乙個是等於我們參考值的區間的左邊界,另外乙個是右邊界

* arr[left + 1 ... lt] < value

* arr[gt ... right] > value

* arr[lt+1 ... i) == value

這是三路快排的思想,也希望大家能熟悉三路快排,這個版本應該是最常用的,這個明白了,其他兩個版本也就很簡單了。

話不多說,直接上**:

package com.smarking.lzy.part1;

/* * 三路快速排序

* * 雙路排序是兩個索引,所以三路排序就是三個索引了

* * 所以我們這次返回的就是等於參考值的區間,我們返回乙個陣列,陣列中儲存兩個元素,乙個是等於我們參考值的區間的左邊界,另外乙個是右邊界

* arr[left + 1 ... lt] < value

* arr[gt ... right] > value

* arr[lt+1 ... i) == value

* * 邊界很重要!!!問題出錯都是處在邊界的理解,一定要好好理解邊界問題!

* */

public class quitsortthird

int positions = partition(arr,left,right);

sort(arr,left,positions[0] - 1);

sort(arr,positions[1],right); }

//重點,返回等於參考值的區間

private static int partition(int arr,int left,int right) else if(arr[i] > value) else

} sorttesthelper.swap(arr, left, lt);

positions[0] = lt;

positions[1] = gt;

return positions; }

public static void main(string args) ;

int arr2 = sorttesthelper.copyarray(arr1);

int arr3 = sorttesthelper.copyarray(arr1);

sort(arr1,0,arr1.length-1);

sorttesthelper.comparator(arr2);

if(!sorttesthelper.isequal(arr1, arr2))

} if(success) else

}}

DAY05(冒泡,選擇排序)

1 氣泡排序 優化前 public class maopao 分析 前乙個與後乙個比較大小,如果前乙個比後乙個大則交換順序,每一次迴圈,得到的就是最大的那個數在末尾 假設陣列元素有2 5 1 6 3 迴圈第0次 2 5 1 6 3 2 1 5 6 3 2 1 5 6 3 比較了,沒交換 2 1 5 ...

day05 陣列 排序

pragma mark 陣列 變數實際上就是乙個容器,陣列也是乙個容器,這個容器可以儲存更多的內容。1.陣列屬於構造型別 2.具有相同資料型別的成員組成一組陣列。3.儲存不同型別的陣列有對應的名稱,如 ios班 安卓版,同理,整數型別 陣列中的成員都是整數,浮點型陣列,陣列中的成員是浮點型。4.陣列...

排序(冒泡 選擇 插入 快速 歸併)

今天把之前寫的排序整理了一下,之前寫的有點亂,現在把這些整合在一起,後續在接觸到別的排序演算法會繼續在這篇博文上新增。排序演算法一 氣泡排序public static void bubblesort for int i 0 iarray j 1 for int tem array 排序演算法二 選擇...