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