成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

常見的初級排序算法,這次全搞懂

開發(fā) 前端 算法
相信所有的程序員剛開始接觸到的算法都會是排序算法,因為排序在對數(shù)據(jù)處理和計算有這重要的地位,排序算法往往是其他算法的基礎(chǔ);本文我們就先從初級排序算法開始學(xué)習(xí)算法。

[[383742]]

本文轉(zhuǎn)載自微信公眾號「貝塔學(xué)JAVA」,作者Silently9527。轉(zhuǎn)載本文請聯(lián)系貝塔學(xué)JAVA公眾號。

本文已被Github倉庫收錄 https://github.com/silently9527/JavaCore

程序員常用的IDEA插件:https://github.com/silently9527/ToolsetIdeaPlugin

完全開源的淘客項目:https://github.com/silently9527/mall-coupons-server

前言

相信所有的程序員剛開始接觸到的算法都會是排序算法,因為排序在對數(shù)據(jù)處理和計算有這重要的地位,排序算法往往是其他算法的基礎(chǔ);本文我們就先從初級排序算法開始學(xué)習(xí)算法。

排序算法的模板

在開始之前我們先定義一個排序算法通用的模板,在后面的排序算法都會實現(xiàn)這個模板

  1. public interface SortTemplate { 
  2.  
  3.     void sort(Comparable[] array); 
  4.  
  5.     default void print(Comparable[] array) { 
  6.         for (Comparable a : array) { 
  7.             System.out.print(a + " "); 
  8.         } 
  9.     } 
  10.  
  11.     default boolean less(Comparable a, Comparable b) { 
  12.         return a.compareTo(b) < 0; 
  13.     } 
  14.  
  15.     default void exch(Comparable[] array, int i, int j) { 
  16.         Comparable tmp = array[i]; 
  17.         array[i] = array[j]; 
  18.         array[j] = tmp; 
  19.     } 
  20.      
  • Comparable: 為了讓我們實現(xiàn)的排序算法更加的通用,可以排序任意的對象,所以我們這里使用了Comparable數(shù)組
  • sort: 不同的排序算法實現(xiàn)的方式不一樣,子類自己去實現(xiàn)
  • less: 定義的公用方法,如果a < b就返回true
  • exch: 定義的公用方法,交換數(shù)組中的兩個對象
  • print: 打印出數(shù)據(jù)中的每個元素

選擇排序

算法實現(xiàn)的思路:

  • 首先找到數(shù)組中的最小元素,
  • 其實將它和數(shù)組中的第一個元素進行交換,這樣就排定了一個元素;
  • 再次找出剩余元素中最小的元素與數(shù)組中的第二個元素進行交換,如此反復(fù)直到所有元素都是有序的

代碼實現(xiàn):

  1. public class SelectionSort implements SortTemplate { 
  2.  
  3.     @Override 
  4.     public void sort(Comparable[] array) { 
  5.         int length = array.length; 
  6.         for (int i = 0; i < length; i++) { 
  7.             int min = i; 
  8.             for (int j = i + 1; j < length; j++) { 
  9.                 if (less(array[j], array[min])) { 
  10.                     min = j; 
  11.                 } 
  12.             } 
  13.             exch(array, i, min); 
  14.         } 
  15.     } 
  16.  

假如輸入的數(shù)組是有序的,我們會發(fā)現(xiàn)選擇排序運行的時候和未排序的時間一樣長!

對于N個元素的數(shù)組,使用「選擇排序的時間復(fù)雜度是O(n2)」

選擇排序的是「數(shù)據(jù)移動最少」的,交換的次數(shù)與數(shù)組的大小是線性關(guān)系,N個元素的數(shù)組需要N次交換

冒泡排序

算法實現(xiàn)的思路:

比較相鄰的兩個元素,如果前一個比后一個大,那么就交換兩個元素的位置

對每一組相鄰的元素執(zhí)行同樣的操作,直到最后一個元素,操作完成之后就可以排定一個最大的元素

如此往復(fù),直到數(shù)組中所有的元素都有序

代碼實現(xiàn):

  1. public class BubbleSort implements SortTemplate { 
  2.  
  3.     @Override 
  4.     public void sort(Comparable[] array) { 
  5.         int length = array.length - 1; 
  6.         for (int i = 0; i < length; i++) { 
  7.             for (int j = 0; j < length - i; j++) { 
  8.                 if (less(array[j + 1], array[j])) { 
  9.                     exch(array, j, j + 1); 
  10.                 } 
  11.             } 
  12.         } 
  13.     } 
  14.  

對于N個元素的數(shù)組,使用「冒泡排序的時間復(fù)雜度是O(n2)」

插入排序

想象我們在玩撲克牌時,整理撲克牌都是把每一張插入到左邊已經(jīng)排好序的牌中適當(dāng)?shù)奈恢?。插入排序的思路類?/p>

算法實現(xiàn)的思路:

  • 初始默認(rèn)第一個元素就是有序的,當(dāng)前索引的位置從0開始
  • 先后移動當(dāng)前索引的位置,當(dāng)前索引位置左邊的元素是有序的,從后往前開始掃碼與當(dāng)前索引位置元素進行比較
  • 當(dāng)確定當(dāng)前索引位置上的元素在左邊有序適合的位置之后,插入到該位置上
  • 如果當(dāng)確定當(dāng)前索引位置上的元素大于了已排序的最后一個元素,那么當(dāng)前索引位置直接往后移動
  • 如此反復(fù),直到所有元素有序

代碼實現(xiàn):

  1. public class InsertionSort implements SortTemplate { 
  2.  
  3.     @Override 
  4.     public void sort(Comparable[] array) { 
  5.         int length = array.length; 
  6.         for (int i = 1; i < length; i++) { 
  7.             for (int j = i; j > 0 && less(array[j], array[j - 1]); j--) { 
  8.                 exch(array, j, j - 1); 
  9.             } 
  10.         } 
  11.     } 
  12.  

從代碼的實現(xiàn)我們可以看出,當(dāng)遇到了當(dāng)前索引的元素大于了左邊有序數(shù)組的最后一個元素時,內(nèi)層循環(huán)就直接結(jié)束了,所以所我們排序的數(shù)組中存在著部分有序,那么插入排序算法會很快。

考慮最糟糕的情況,如果輸入數(shù)組是一個倒置的,那么插入排序的效率和選擇排序一樣,「時間復(fù)雜度是O(n2)」

希爾排序

對于大規(guī)模的亂序數(shù)組插入排序很慢,是因為它只交換相鄰的元素,元素只能一點一點的從數(shù)組中移動到正確的位置;插入排序?qū)τ诓糠钟行虻臄?shù)組排序是的效率很高;

希爾排序基于這兩個特點對插入排序進行了改進;

算法實現(xiàn)的思路

  • 首先設(shè)置一個步長h用來分隔出子數(shù)組
  • 用插入排序?qū)個子數(shù)組獨立排序
  • 減小h步長繼續(xù)排序子數(shù)組,直到h步長為1
  • 當(dāng)步長為1時就成了普通的插入排序,這樣數(shù)組一定是有序的

希爾排序高效的原因,在排序之初,各個子數(shù)組都很短,子數(shù)組排序之后都是部分有序的,這兩種情況都很適合插入排序。

代碼實現(xiàn):

  1. public class ShellSort implements SortTemplate { 
  2.  
  3.     @Override 
  4.     public void sort(Comparable[] array) { 
  5.         int gap = 1; 
  6.         int length = array.length; 
  7.  
  8.         while (gap < length / 3) { 
  9.             gap = 3 * gap + 1; 
  10.         } 
  11.  
  12.         while (gap >= 1) { 
  13.             for (int i = gap; i < length; i++) { 
  14.                 for (int j = i; j >= gap && less(array[j], array[j - gap]); j -= gap) { 
  15.                     exch(array, j, j - gap); 
  16.                 } 
  17.             } 
  18.             gap = gap / 3; 
  19.         } 
  20.     } 
  21.  

 

責(zé)任編輯:武曉燕 來源: 貝塔學(xué)JAVA
相關(guān)推薦

2021-02-22 07:29:07

算法初級排序

2021-02-03 15:30:10

面試垃圾回收器前端

2022-05-17 12:23:25

排序算法面試

2021-01-29 17:07:26

排序算法數(shù)組

2025-03-17 00:21:00

2022-03-26 08:49:13

MySQL數(shù)據(jù)存儲

2017-11-22 14:20:07

前端JavaScript排序算法

2023-12-04 07:49:06

選擇排序排序算法

2022-11-01 18:29:25

Go語言排序算法

2011-02-17 09:11:40

JavaScript算法

2020-10-23 10:10:59

Promise前端代碼

2016-09-30 14:23:16

數(shù)據(jù)結(jié)構(gòu)算法八大排序算法

2021-11-10 09:17:18

程序員排序算法搜索算法

2023-02-09 07:39:01

2021-09-30 07:57:13

排序算法面試

2021-09-04 23:40:53

算法程序員前端

2022-09-24 09:03:55

前端單元測試冒泡排序

2021-11-08 15:12:48

排序算法面試

2024-08-30 14:34:00

2021-04-07 20:01:23

Go變量常量
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 91精品国产综合久久精品图片 | 日韩av高清 | 久久久久久国产精品免费免费 | 在线视频一区二区 | 中文字幕日韩一区二区 | 久久久久精 | 日韩中文字幕一区 | 国产一区二区三区久久久久久久久 | 久久精品女人天堂av | 97人人澡人人爽91综合色 | 日本在线视频不卡 | 美女久久久久久久 | 中文字幕不卡一区 | 一区观看 | 国产激情精品一区二区三区 | 久久久国产一区二区 | 中国av在线免费观看 | 国产伦精品一区二区三区视频金莲 | 中文字幕在线视频免费视频 | 国产做爰 | 午夜在线视频一区二区三区 | 91免费电影 | 成人免费视频久久 | a级黄色网 | 成人免费视频在线观看 | 又爽又黄axxx片免费观看 | 国产在线精品一区二区三区 | 国产色婷婷精品综合在线手机播放 | 黄色在线免费网站 | 青青草亚洲| 欧美日韩一区二区三区在线观看 | 亚洲精品福利视频 | www.se91| www97影院 | 日韩精品一二三 | 久久大香| 精品一区二区三区电影 | 91大神在线资源观看无广告 | 中文字幕在线观看日韩 | 91高清在线观看 | 日本精品久久久久 |