国产成人无码一区二区三区在线_亚洲一区二区三区精品在线_国严精品久久久久久亚洲影视 _国产精品福利在线播放_中文字幕av导航_玉米视频成人免费看_国产v亚洲v天堂无码久久久_一区二区三区资源_免费成人深夜夜行视频_国产在线观看成人_一区二区三区产品免费精品久久75_国产国语videosex另类

站長資訊網
最全最豐富的資訊網站

Java數據結構常見排序算法(總結分享)

本篇文章給大家帶來了關于java的相關知識,其中主要介紹了一些常見的排序算法,包括了直接插入排序、希爾排序(縮小增量排序)、選擇排序以及堆排序等內容,下面一起來看一下,希望對大家有幫助。

Java數據結構常見排序算法(總結分享)

1、 認識排序

在學校中,如果我們要參加運動會,或者軍訓的時候,會按照身高從矮到高進行站隊,比如上課老師手上拿的考勤表,通常是按照學號從低到高進行排序的。再比如編程語言排行榜,也是在排序。

Java數據結構常見排序算法(總結分享)

生活中有相當多的排序場景,由此可知,排序還是很重要的, 本章就會介紹常見的一些排序算法。

所謂排序呢,就拿我們上面的舉例來說,會按照某個或某些關鍵字的大小,遞增或者遞減排列起來的操作,這就是排序,這里面也涉及到排序的穩定性,舉個例子:

比如有這樣的一組數據:B D A C A F,要按照他們的 ascll 碼來排序,這里出現了兩個 A,我們把第一個出現的 A 稱為 A1,第二個出現的 A 稱為 A2。

假定排序后結果為:A1 A2 B C D F,那么這個排序算法就是穩定的。

假設排序后結果為:A2 A1 B C D F,那么這個排序算法就是不穩定的。

簡而言之,如果待排序的數據中,有兩個相同的元素,排序結束后,這兩個元素的關系沒有發生改變,比如 A1 排序前在 A2 前面,排完序后,A1 還在 A2 前面,這就是穩定的排序算法。

注意:一個不穩定的排序算法,天生就是不穩定的,但是一個穩定的排序算法,你可以把它設計成不穩定的。

2、常見排序的分類

Java數據結構常見排序算法(總結分享)

這張圖,概括了我們后續要講的排序算法,接著正式進入本章的學習吧!(排序算法章節,默認都是升序排序) 注:后續所說的復雜度 log,都是以2為底,特殊的會標注出來。

3、直接插入排序

現在想請各位小伙伴,想象一下自己在摸撲克牌,摸了第一張牌放在了自己的手中,接著再摸一張,把這張牌跟手上的一張牌進行比較,把它放到合適的位置, 接著再摸一張,把這張牌跟手上的兩張牌進行比較,放到合適的位置。

這就是直接插入排序,簡單來說,我們每次取的元素,會往一個有序的序列中插入,也就是每次摸牌之前,手上的牌都是排好序的,我們只需要把新摸到的牌,依次與手上有序的牌進行比較,把它放入合適的位置就行!

這里我們用一副靜態的圖來簡單演示下:

Java數據結構常見排序算法(總結分享)

大致的思想我們已經明白了,接下來我們就需要用代碼來實現他:

public void insertSort(int[] array) {     // 外循環控制趟數, 第一張牌默認有序, 所以 i 從 1 開始     for (int i = 1; i < array.length; i++) {         int tmp = array[i]; //當前摸到的牌         // 每次從手中牌的最后一張牌開始比較, 一直比到第一張牌         int j = i - 1;         for (; j >= 0; j--) {             //如果當前位置的牌,大于我摸到的牌,就往后挪             if (array[j] > tmp) {                 array[j + 1] = array[j];             } else {                 break;             }         }         // 把摸到的牌放到對應位置上         array[j + 1] = tmp;     } }
登錄后復制

  • 時間復雜度分析:外循環一共要 n – 1 次,內循環每次最差的情況下要比較 1….n 次,那么去掉 n 前面的小項,也就是 (n – 1) * n 次,即 n^2 – n,去掉最小項,最后的時間復雜度為 O(n^2)
  • 空間復雜度分析:只是開辟了一個 tmp 的變量 i,j,常數,即空間復雜度:O(1)
  • 穩定性:穩定
  • 該排序再數據越接近有序的情況,時間效率越高。

4、希爾排序(縮小增量排序)

這個排序是直接插入排序的一種優化,你可以想象一下,你面前有并排放好的 8 個愛心號碼牌,但是它們是無序的,我們要給號碼牌分組,按要求,第一次間隔為 4 個號碼牌的為一組,分完組后進行直接插入排序,第二次間隔為 2 個號碼牌的為一組,進行直接插入排序,第三次間隔為 1 個號碼牌為一組,進行直接插入排序。

聽到這有點沒理解,沒關系,我們就通過畫圖來把我上述說的內容再次理解下:

Java數據結構常見排序算法(總結分享)

由上圖我們可以發現,當間隔 > 1 的時候,都是預排序,也就是讓我們的數據更接近有序,但是當間隔為 1 的時候,就是直接插入排序了,前面我們說過,直接插入排序,再數據接近有序的時候時間效率是很快的。由此可見,希爾排序,是直接插入排序的優化版。

如何在代碼中實現呢?間隔的值如何取呢?代碼中把這個間隔的值稱為 gap,這個 gap 的取值方法有很多,有的人提出 gap 為奇數好,有的提出 gap 為偶數好,我們就采取一種比較簡單的方法來取 gap 值,首次取數組長度一半的值為 gap,后續 gap /= 2,即可。當 gap 為 1,也就是直接插入排序了。

代碼實現如下:

public void shellSort(int[] array) {     // gap初始值設置成數組長度的一半     int gap = array.length >> 1;     // gap 為 1 的時候直接插入排序     while (gap >= 1) {         shell(array, gap);         gap >>= 1; // 更新 gap 值 等價于 -> gap /= 2;     } } private void shell(int[] array, int gap) {     for (int i = gap; i < array.length; i++) {         int tmp = array[i];         int j = i - gap;         for (; j >= 0; j -= gap) {             if (array[j] > tmp) {                 array[j + gap] = array[j];             } else {                 break;             }         }         array[j + gap] = tmp;     } }
登錄后復制

如果實在是不好理解,就結合上邊講的直接插入排序來理解,相信你能理解到的。

  • 時間復雜度分析:希爾排序的時間復雜度不好分析, 這里我們就大概記一下,約為 O(n^1.3),感興趣的話,可以查閱一下相關書籍。
  • 空間復雜度分析:仍然開辟的是常數個變量,空間復雜度為 O(1)
  • 穩定性:不穩定

5、選擇排序

這個排序是個很簡單的排序,你想象一下,有個小屁孩,喜歡玩小球,我給他安排了個任務,把這一排小球從小到大排列起來,擺給我看,于是小屁孩就找,每次從一排小球中找出最大的,放到最后,固定不動,那是不是也就是說,每次能確定一個最大的石子的最終位置了。我們來看圖:

Java數據結構常見排序算法(總結分享)

通過圖片我們也能看出來,每次找到最大值于最后一個值交換,所以每趟都能把最大的放到最后固定不動,每趟能排序一個元素出來,那這樣用代碼來實現就很簡單了:

public void selectSort(int[] array) {     int end = array.length - 1;     // 剩最后一個元素的時候, 不用比較了, 已經有序了     // 所以 i < array.length - 1     for (int i = 0; i < array.length - 1; i++) {         int max = 0;         int j = 0;         while (j <= end) {             if (array[j] > array[max]) {                 max = j;             }             j++;         }         //找到了最大值的下標, 把最大值與最后一個值交換         swap(array, max, end--); // end-- 最后一個元素固定了, 不用參與比較     } }
登錄后復制

這個算法有沒有可以優化的空間呢?

有!那么既然小屁孩能一次找出最大的球,那能不能讓小屁孩一次找出兩個球出來呢?分別是這些球中,最大的和最小的,最大的放在最右邊,最小的放在最左邊,那么我們每次就能確定兩個球的最終位置,也就是我們一次能排序兩個元素。圖解:

Java數據結構常見排序算法(總結分享)

代碼實現如下:

public void selectSort(int[] array) {     int left = 0;     int right = array.length - 1;     while (left < right) {         int maxIndex = left;         int minIndex = left;         // i = left + 1 -> 每次找最大最小值下標的時候, 可以不用算默認給的最大值和最小值下標         for (int i = left + 1; i <= right; i++) {             if (array[i] > array[maxIndex]) {                 maxIndex = i;             }             if (array[i] < array[minIndex]) {                 minIndex = i;             }         }         swap(array, minIndex, left);         // 如果最大值為 left 的位置情況的話, 走到這, 最大值已經被交換到 min 位置上了         if (maxIndex == left) {             // 更新最大值的位置             maxIndex = minIndex;         }         swap(array, maxIndex, right);         left++;         right--;     } }
登錄后復制

  • 時間復雜度分析:雖然是優化了,但去小項之后,還是 O(n^2)
  • 空間復雜度分析:O(1)
  • 穩定性:不穩定
  • 實際開發中用的不多

6、堆排序

如果你有學習過優先級隊列,或者看過博主優先級隊列的文章,那么這個排序對于你來說還是很輕松的,當然在堆排序的講解中,不會過多的去介紹堆的概念,如果對這部分概念還不理解,可以移至博主的上一篇文章進行學習。

堆排序,簡單來說,就是把一組數據,看成一個完全二叉樹,再把這棵樹,建大堆或者建小堆,接著進行排序的一種思路。至于如何建大堆或小堆,和向上調整算法以及向下調整算法,這里也不多介紹了,博主的上篇文章都詳細介紹過。

這里我們來分析一下,排升序應該建什么堆?大堆!排降序建小堆!

這里我們來排升序,建大堆,因為大堆堆頂元素一定是堆中最大的,所以我們可以把堆頂元素和最后一個元素進行交換,這樣我們就確認了最大值的位置,接著將交換后的堆頂元素進行向下調整,仍然使得該數組滿足大堆的特性!圖解如下:

Java數據結構常見排序算法(總結分享)

Java數據結構常見排序算法(總結分享)

如上圖步驟也很簡單,先是將數組建成大堆,然后利用大堆來進行堆排序,首先將堆頂元素和最后一個元素交換,由此最大的元素就有序了,接著將該堆進行向下調整,使繼續滿足大堆性質,依次進行下去即可。

代碼實現:

public void heapSort(int[] array) {     // 建大堆 從最后一個非葉子節點開始向下調整     // 非葉子節點下標 = (孩子節點下標 - 1) / 2     for (int parent = (array.length - 1 - 1) / 2; parent >= 0; parent--) {         shiftDown(array, parent, array.length);     }     // 建大堆完成后, 每次堆頂元素與最后一個元素交換, 鎖定最大元素的位置     for (int len = array.length - 1; len > 0; len--) {         swap(array, 0, len); //根節點與最后一個元素交換         shiftDown(array, 0, len); //根節點位置向下調整     } } private void shiftDown(int[] array, int parent, int len) {     int child = parent * 2 + 1;     while (child < len) {         if (child + 1 < len && array[child + 1] > array[child]) {             child++;         }         // 判斷父節點是否大于較大的孩子節點         if (array[parent] < array[child]) {             swap(array, parent, child);             // 更新下標的位置             parent = child;             child = parent * 2 + 1;         } else {             return;         }     } }
登錄后復制

  • 時間復雜度分析:建堆的時間復雜度優先級隊列那期有說過為 O(n),排序調整堆的時候,一共要調整 n-1 次,每次向下調整的時間復雜度是 logn,所以即 logn(n – 1),即 O(n*logn),加上面建堆的時間復雜度:O(n) + O(n*logn),最終時間復雜度也就是:O(n*logn)。
  • 空間復雜度分析:O(1)
  • 穩定性:不穩定

推薦學習:《java視頻教程》

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
日韩va在线观看| 欧美日韩国产不卡| 日本色综合中文字幕| 一区二区三区www污污污网站| 日本熟妇成熟毛茸茸| 一区二区三区福利视频| 久久久久久无码午夜精品直播| 国产精品100| 中文字幕资源网| 欧美天堂在线视频| 国产主播一区二区三区| 97久久超碰国产精品电影| 2020日本不卡一区二区视频| 中文字幕免费一区| 亚洲高清不卡在线观看| 欧美日韩在线免费观看| 91精品国产美女浴室洗澡无遮挡| 精品无人国产偷自产在线| 中文字幕亚洲一区在线观看| 午夜精品久久久久久久男人的天堂| 日本成人免费在线| www 成人av com| 一区二区三区四区五区精品| 18禁网站免费无遮挡无码中文| 日本一极黄色片| 中文字幕在线永久| 天天综合天天做| 中文字幕免费高清网站| 三级网站免费观看| 成人看片黄a免费看在线| 亚洲欧洲一区二区三区| 欧美亚洲一区二区在线观看| 亚洲欧洲激情在线| 茄子视频成人在线| 欧美一二三区| 国产精品人人妻人人爽人人牛| 亚洲黄色小说在线观看| 欧美色图亚洲天堂| 女人18毛片水真多18精品| 国产成人小视频| 亚洲午夜精品在线| 日韩av在线免费| 国产精品九九久久久久久久| 亚洲砖区区免费| 国产三级生活片| 欧美黑人一级片| 久久久久综合| 亚洲精品成人悠悠色影视| 精品国产91亚洲一区二区三区婷婷| 97久久精品人搡人人玩| 日韩黄色影视| 日本女人高潮视频| 四虎成人在线播放| 五月天综合在线| 中文字幕人妻一区二区三区视频| 国产精品777| 日韩成人av网站| 亚洲图片 自拍偷拍| 激情视频在线播放| 老司机精品视频网站| 亚洲女人****多毛耸耸8| 亚洲高清福利视频| 国产精品一二区| 亚洲熟妇无码一区二区三区| 侵犯稚嫩小箩莉h文系列小说| 熟妇人妻一区二区三区四区 | 黄色片网站在线播放| 国产精品无码一区二区桃花视频| 久久久久久毛片| 91精品国产欧美一区二区| 国产精品99久久久久久www | 一区二区三区四区蜜桃| 亚洲一区av在线播放| 国产综合精品一区二区三区| 在线观看网站黄| 极品蜜桃臀肥臀-x88av| 欧美自拍偷拍一区二区| 亚洲三级视频在线观看| 久久久精品电影| 亚洲日本精品国产第一区| 无码人妻aⅴ一区二区三区| 丰满少妇一级片| 亚洲成人av在线电影| 欧美成人精品三级在线观看| 精品少妇人妻av一区二区| 91香蕉视频污在线观看| 中文字幕av资源| 一区二区三区日韩欧美精品 | 337p日本欧洲亚洲大胆精品| 亚洲精品视频在线观看视频| 亚洲狠狠丁香婷婷综合久久久| 日本少妇高潮喷水视频| 亚洲精品国产精品久久清纯直播 | 国产日韩精品入口| 91视频最新入口| 日本中文在线播放| 国产精品午夜在线观看| 精品中文字幕乱| 日本a级片免费观看| 成人黄色三级视频| 亚洲影视资源网| 91精品国产成人www| 妞干网在线免费视频| 91theporn国产在线观看| 午夜精品久久久久久不卡8050| 午夜精品一区二区三区在线视| 黄色一级视频播放| 国产精品人人人人| 一区二区三区鲁丝不卡| 国产精品毛片a∨一区二区三区|国| 911福利视频| 人妻无码一区二区三区久久99 | 91国产免费看| 国产精品12| 免费精品在线视频| 国产精品狼人久久影院观看方式| 97成人精品区在线播放| 91色九色蝌蚪| 麻豆中文一区二区| 欧美精品韩国精品| 久久久久久国产精品免费播放| 亚洲 欧美 日韩系列| 男人透女人免费视频| 草草草在线视频| 日韩精彩视频| 亚洲成人第一| 亚洲精品成人三区| 国产男女无遮挡猛进猛出| 欧美丰满少妇人妻精品| 成人在线一级片| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲欧美一区二区三区极速播放| 日本视频在线观看免费| 国产午夜手机精彩视频| 国产免费黄视频| 欧美xxxx综合视频| 欧美影片第一页| 天天影视色香欲综合网老头| 日韩精品1区2区3区| 国产精品久久久久久久久久久久久久久久久| 动漫av网站免费观看| 日韩精品在线中文字幕| 成年人小视频在线观看| 久久久久久久久久一区二区三区| 久久久久久黄| 精品一区二区三区久久| 亚洲人123区| 亚洲一二三在线| 欧美最猛性xxxx| 国产黄页在线观看| 免费一级片在线观看| 蜜桃视频一区| 亚洲欧美日韩在线播放| 欧美精品一区二区三区很污很色的| 国产精品视频在线播放| 婷婷视频在线播放| 影音先锋男人在线| 日韩—二三区免费观看av| 亚洲成人综合在线| 韩剧1988免费观看全集| 欧美黑人又粗又大又爽免费| a片在线免费观看| 亚洲色图在线播放| 另类少妇人与禽zozz0性伦| 国产精品91视频| 五月激情婷婷在线| 国产毛片一区二区三区va在线 | 成人免费黄色av| 久久久国产精华液| 亚洲成人av电影在线| 欧美美女18p| 日本xxx免费| 日批视频免费观看| 午夜精品免费在线观看| 成人免费视频网址| 男人午夜视频在线观看| 四季av日韩精品一区| 91精品国产日韩91久久久久久| 精品一区久久久| 男女羞羞免费视频| 国产精品午夜在线| 88国产精品欧美一区二区三区| 天天综合成人网| 国产九色精品成人porny | 亚洲精选一区二区三区| 亚洲国产精品热久久| 国产自产在线视频| 日批免费在线观看| 一区二区三区天堂av | 欧美最顶级的aⅴ艳星| 成年女人免费视频| 国产女主播一区| 波多野结衣一区二区三区在线观看| 黄色国产在线观看| 专区另类欧美日韩| 久久久99国产精品免费| 亚洲天堂网视频| 这里只有精品视频在线| 亚洲一区二区三区观看| 国产成人在线视频免费播放| 国产91网红主播在线观看| 久久老司机精品视频| 日韩一区二区三区在线| 亚洲另类第一页| 国产精品69毛片高清亚洲| 国产精品亚洲一区二区三区| 男人午夜免费视频| 日韩av影视综合网| 一级特级黄色片| 一本大道久久精品懂色aⅴ | 欧美成年人视频| 加勒比婷婷色综合久久| 精品国产乱码91久久久久久网站| 艳母动漫在线观看| 成人免费视频视频在线观看免费| 国产精品高潮呻吟久久av黑人| 国产免费观看av| 色偷偷888欧美精品久久久 | 波多野结衣国产精品| 一区二区视频在线| 日韩在线视频在线观看| 中文字幕av一区二区三区免费看 | 国产一区二区自拍| 精品久久人妻av中文字幕| 欧美怡红院视频一区二区三区| av一区二区三| 91chinesevideo永久地址| 久久久999久久久| 韩国视频理论视频久久| 国产美女自慰在线观看| 96成人在线视频| av综合在线播放| 日本一区二区三区在线视频| 99视频精品在线| 性一交一乱一伧国产女士spa| 久久久久久久久久久黄色| 精品视频免费在线播放| 亚洲人成网站在线| 三上悠亚在线一区| 日韩欧美国产午夜精品| 久久久久久激情| 51久久精品夜色国产麻豆| 亚洲精品一区二区三区区别 | 欧美日韩dvd在线观看| 日本成人免费视频| 久久综合免费视频影院| 亚洲国产视频一区二区三区| 亚洲精品在线视频观看| 国产精品初高中害羞小美女文| 污视频在线观看免费网站| 日韩乱码在线视频| 亚洲成a人片77777精品| 久久精品一二三区| 专区另类欧美日韩| www.日本久久| 亚洲精品一区二区在线| 国产露脸无套对白在线播放| 午夜精品短视频| 欧美亚男人的天堂| 亚洲二区在线播放| 久久视频免费在线播放| 久久精品久久综合| 日本午夜精品一区二区三区| 亚洲成va人在线观看| www,av在线| 日韩一级片网站| 一本一道人人妻人人妻αv | 亚洲欧美另类中文字幕| 亚洲av中文无码乱人伦在线视色| 高清av免费一区中文字幕| 国产精品理伦片| 99久久99久久精品免费| 欧美在线视频网| 亚洲国产一区二区三区青草影视| 91香蕉在线视频| 欧美高清性xxxxhdvideosex| 91国产福利在线| 亚洲一级特黄毛片| 51国产成人精品午夜福中文下载| 国产精品欧美经典| 久久久国产高清| 91手机视频在线| 亚洲热线99精品视频| 国产99精品视频| 性色av无码久久一区二区三区| 2022国产精品| 亚洲色欲色欲www| 蓝色福利精品导航| 三区视频在线观看| 欧美国产日韩在线| 久久久国产精品午夜一区ai换脸| 免费a级黄色片| 欧美激情网友自拍| 99视频精品在线| 老司机福利av| 麻豆传媒一区| 欧美精品一区二区三| 国产伦精品一区二区三区免费 | 久久久不卡网国产精品二区| 无套内谢大学处破女www小说| 5566中文字幕一区二区| 亚洲成人动漫在线观看| 青青青国产在线| 手机在线观看日韩av| 亚洲999一在线观看www| 一区二区三区四区不卡视频| 人人妻人人玩人人澡人人爽| 99久久久无码国产精品6| 久久久精品日本| 亚洲色图20p| 国产一级视频在线| 久久久久久国产精品mv| 91欧美一区二区| 大黑人交xxx极品hd| 一区二区不卡在线| 日韩中文第一页| 久久天堂av综合合色蜜桃网| 久久精品视频1| 久久婷婷国产91天堂综合精品| 国产精品成av人在线视午夜片| 日韩欧美国产三级| 欧美激情在线看| 亚洲欧美国产高清va在线播放| 亚洲精品乱码久久久久久动漫| 蜜桃欧美视频| 97国产精品视频人人做人人爱| 伊人婷婷欧美激情| 蜜臀精品一区二区三区在线观看| 久久久久久久久久福利| 欧美日韩一区在线播放| 日本中文字幕久久看| 亚洲天天在线日亚洲洲精| 自拍偷拍欧美激情| 久久精品久久久精品美女| 超碰在线97观看| 9.1成人看片免费版| 综合网五月天| 91亚洲va在线va天堂va国 | 国产成人综合精品| 日韩精品在线网站| 国产a区久久久| 人人妻人人玩人人澡人人爽| 九九视频免费看| 国产毛片久久久久久久| 亚洲精品中文字幕乱码无线| 亚洲天堂av综合网| 欧美日韩午夜激情| 亚洲综合色丁香婷婷六月图片| 26uuu色噜噜精品一区二区| 狠狠色综合色综合网络| 久久九九99| 精品人妻少妇嫩草av无码专区| 中文字幕人妻一区二区三区在线视频| 免费看污久久久| 国产av第一区| 亚洲人成网站777色婷婷| 亚洲三级黄色片| 波多野结衣小视频| 别急慢慢来1978如如2| 激情久久av| 欧美一级片免费在线| 亚洲图片制服诱惑| 国产视频在线观看免费| 欧美日韩在线观看成人| 中文字幕久精品免| 精品一区久久| 久久国产精品久久精品国产| 欧美一级大片在线观看| 亚洲成人高清在线| 亚洲国产裸拍裸体视频在线观看乱了| 污视频在线免费| 日本在线不卡视频| 天天干,天天干| 亚洲视频重口味| 不卡一区二区在线观看| 中文字幕一区二区在线观看视频 | 成人在线免费观看av| 大陆极品少妇内射aaaaaa| 强开小嫩苞一区二区三区网站| 亚洲精品日韩成人| 热久久最新地址| 日韩国产在线一区| av电影一区二区三区| 欧美午夜性视频| 成人综合久久网| 天天躁日日躁aaaa视频| 欧美激情一区二区视频| 亚洲 小说区 图片区| 国产农村老头老太视频| 精品国产伦一区二区三区| 国产乱人乱偷精品视频| 五月婷婷狠狠干| 99国产精品久久久| 欧美色视频日本版| 精品国产精品一区二区夜夜嗨| 欧美国产精品人人做人人爱| 国产成人久久精品| 欧美精品中文字幕一区二区| 韩国一区二区三区美女美女秀| 免费成人午夜视频| 91精品人妻一区二区三区蜜桃欧美 | 免费观看成人高| 欧美一区二区三区在线免费观看| 亚洲欧洲另类精品久久综合| 国产精品自拍视频在线| 国产在线视频二区| 中文在线观看免费高清| 99久久久久久99| 精品亚洲男同gayvideo网站| 91在线直播亚洲|