摘要:一常見的排序算法及時間復(fù)雜度二各排序算法的理解及實現(xiàn)冒泡排序算法描述比較相鄰元素,如果第一個比第二個大,交換位置,這樣每經(jīng)過一趟就冒出一個最大的動圖演示代碼實現(xiàn)快速排序算法描述從數(shù)列中挑出一個元素,稱為基準(zhǔn)從左向右找比這個第一個比這個基
一.常見的排序算法及時間復(fù)雜度 二.各排序算法的理解及實現(xiàn) 1.冒泡排序(Bubble Sort)O(n2)
(1)算法描述
比較相鄰元素,如果第一個比第二個大,交換位置,這樣每經(jīng)過一趟就冒出一個最大的
(2)動圖演示
(3)代碼實現(xiàn)
public static int[] bubbleSort(int arr[]){ int len = arr.length; for(int i = 0;i2.快速排序 O(nlog2n)arr[j+1]){ int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } return arr; }
(1)算法描述
從數(shù)列中挑出一個元素,稱為"基準(zhǔn)"(pivot)
從左向右找比這個第一個比這個基準(zhǔn)大的數(shù),從右往左找第一個比這個基準(zhǔn)小的數(shù),找到后互換位置
繼續(xù)在此基礎(chǔ)上執(zhí)行第二步,直到兩個尋找指針相遇
遞歸的(recursive)把小于基準(zhǔn)值的序列和大于基準(zhǔn)值的序列排序
(2)動圖演示
public static void quickSort(int[]arr, int left,int right) { if(left>right){return; }//遞歸的出口 int i = left,j = right; int pivot = arr[left];//找到基準(zhǔn) while (i < j) { //從右向左找第一個比基準(zhǔn)值小的數(shù) while (i < j && arr[j] >= pivot) { j--; } //從左向右找第一個比基準(zhǔn)值大的數(shù) while (i < j && arr[i] <= pivot) { i++; } //兩面都找到后互換位置 if (i < j) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } } //left=right時于基準(zhǔn)值互換 int tmp = arr[j]; arr[j] = arr[left]; arr[left] = tmp; //分別遞歸的調(diào)用基準(zhǔn)值的左邊和右邊 quickSort(arr,left,i-1); quickSort(arr,i+1,right); }3.簡單插入排序 O(n2)
(1)算法描述
從第二個元素開始(因為認(rèn)為第一個元素已經(jīng)有序)向前掃描
如果前一個數(shù)小于當(dāng)前元素,繼續(xù)跳到下一個元素開始向前掃描
如果前一個數(shù)大于當(dāng)前元素,繼續(xù)向前掃描,直到找到小于這個數(shù)的元素,插到它的后面
(2)動圖演示
(3)代碼實現(xiàn)
public static void insertSort(int[] array){ int len = array.length; for(int i = 1;i4.希爾排序 O(nlogn)0 && array[j-1]>temp;j--){ //如果比待插入數(shù)大 ,向右移 array[j] = array[j-1]; } //如果比帶插入數(shù)小,插在該數(shù)后面 array[j] = temp; }
(1)算法描述
其實就是對插入排序進(jìn)行了優(yōu)化,先對相同間隔的一組數(shù)進(jìn)行插入排序,使序列基本有序,再進(jìn)行間隔為1的插入排序時,減少工作量。(代碼實現(xiàn)可對照插入排序,其實就是多了一組循環(huán))
(2)動圖演示
(3)代碼實現(xiàn)
public static void shellSort(int[] array){ int len= array.length; int gap;//增量長度 for(gap = len/2;gap>0;gap/=2){ for(int i = gap;i5.簡單選擇排序 O(n2)gap && array[j - gap] > temp; j-=gap) { //如果比待插入數(shù)大 ,向右移 array[j] = array[j - gap]; } //如果比待插入數(shù)小,插在該數(shù)后面 array[j] = temp; } } }
(1)算法描述
將序列劃分為有序區(qū)和無序區(qū)(初始狀態(tài)有序區(qū)為空)
遍歷無序區(qū),選出最小的元素,放到有序區(qū)
(2)動圖演示
(3)代碼實現(xiàn)
public static int[] selectSort(int array[]){ for(int i=0;i6.堆排序 (1)算法描述
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/69107.html
摘要:算法描述冒泡排序是一種簡單的排序算法。算法描述和實現(xiàn)一般來說,插入排序都采用在數(shù)組上實現(xiàn)。平均情況希爾排序年發(fā)明第一個突破的排序算法是簡單插入排序的改進(jìn)版它與插入排序的不同之處在于,它會優(yōu)先比較距離較遠(yuǎn)的元素。 前言 讀者自行嘗試可以想看源碼戳這,博主在github建了個庫,讀者可以Clone下來本地嘗試。此博文配合源碼體驗更棒哦~~~ 個人博客:Damonare的個人博客 原文地址:...
摘要:數(shù)據(jù)結(jié)構(gòu)和算法樹快速排序,堆排序,插入排序其實八大排序算法都應(yīng)該了解一致性算法,一致性算法的應(yīng)用的內(nèi)存結(jié)構(gòu)。如何存儲一個的。八大排序算法一定要手敲一遍快排,堆排尤其重要。面試是一個雙向選擇的過程,不要抱著畏懼的心態(tài)去面試,不利于自己的發(fā)揮。 前言 16年畢業(yè)到現(xiàn)在也近兩年了,最近面試了阿里集團(tuán)(菜鳥網(wǎng)絡(luò),螞蟻金服),網(wǎng)易,滴滴,點我達(dá),最終收到點我達(dá),網(wǎng)易o(hù)ffer,螞蟻金服二面掛掉,...
摘要:前面介紹了七大算法的思想與實現(xiàn)步驟,下面來做一個歸總。直到無序區(qū)中的數(shù)為零,結(jié)束排序。步驟以從小到大為例,排序數(shù)組大小為。比較完以后則排序結(jié)束。堆排序思想堆排序是采用樹的形式的數(shù)據(jù)結(jié)構(gòu)來進(jìn)行排序的,其中每一個堆都是完全二叉樹。 前面介紹了七大算法的思想與實現(xiàn)步驟,下面來做一個歸總。 排序方法 平均復(fù)雜度 最壞復(fù)雜度 最好復(fù)雜度 輔助空間 穩(wěn)定性 直接選擇排序 O(n^2...
閱讀 835·2023-04-25 22:13
閱讀 2347·2019-08-30 15:56
閱讀 2229·2019-08-30 11:21
閱讀 658·2019-08-30 11:13
閱讀 2024·2019-08-26 14:06
閱讀 1962·2019-08-26 12:11
閱讀 2293·2019-08-23 16:55
閱讀 542·2019-08-23 15:30