前面幾天在學習基礎的排序演算法,從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 排序演算法二 選擇...