java代碼_Java 代碼實現排序算法

90c641199537966710dbad2c15db5019.pngdaad987cfe6fa14b49fc34d2043e4d4a.gif

? ?閱讀本文約需要8分鐘?

大家好,我是你們的導師,我每天都會在這里給大家分享一些干貨內容(當然了,周末也要允許老師休息一下哈)。上次老師跟大家分享了下SpringBoot+Gradle+ MyBatisPlus3.x搭建企業級的后臺分離框架的相關知識,今天跟大家分享Java 代碼實現排序算法的知識。

1?Java 代碼實現排序算法

參考來源:http://www.jianshu.com/p/5e171281a387
1.直接插入排序

經常碰到這樣一類排序問題:把新的數據插入到已經排好的數據列中。

  1. 將第一個數和第二個數排序,然后構成一個有序序列

  2. 將第三個數插入進去,構成一個新的有序序列。

  3. 對第四個數、第五個數……直到最后一個數,重復第二步。

719ac224726df48bf176cf2a295eac54.png

如何寫寫成代碼:

  1. 首先設定插入次數,即循環次數,for(int i=1;i

  2. 設定插入數和得到已經排好序列的最后一個數的位數。insertNum和j=i-1。

  3. 從最后一個數開始向前循環,如果插入數小于當前數,就將當前數向后移動一位。

  4. 將當前數放置到空著的位置,即j+1。

代碼實現如下:

public void insertSort(int[] a){        int length=a.length;//數組長度,將這個提取出來是為了提高速度。        int insertNum;//要插入的數        for(int i=1;i//插入的次數            insertNum=a[i];//要插入的數            int j=i-1;//已經排序好的序列元素個數            while(j>=0&&a[j]>insertNum){//序列從后到前循環,將大于insertNum的數向后移動一格                a[j+1]=a[j];//元素移動一格                j--;            }            a[j+1]=insertNum;//將需要插入的數放在要插入的位置。        }    }

2.希爾排序

對于直接插入排序問題,數據量巨大時。

  1. 將數的個數設為n,取奇數k=n/2,將下標差值為k的書分為一組,構成有序序列。

  2. 再取k=k/2 ,將下標差值為k的書分為一組,構成有序序列。

  3. 重復第二步,直到k=1執行簡單插入排序。

39ce032f977c587aef0f8178e293cee5.png

如何寫成代碼:

  1. 首先確定分的組數。

  2. 然后對組中元素進行插入排序。

  3. 然后將length/2,重復1,2步,直到length=0為止。

代碼實現如下:

public  void sheelSort(int[] a){        int d  = a.length;        while (d!=0) {            d=d/2;            for (int x = 0; x < d; x++) {//分的組數                for (int i = x + d; i < a.length; i += d) {//組中的元素,從第二個數開始                    int j = i - d;//j為有序序列最后一位的位數                    int temp = a[i];//要插入的元素                    for (; j >= 0 && temp < a[j]; j -= d) {//從后往前遍歷。                        a[j + d] = a[j];//向后移動d位                    }                    a[j + d] = temp;                }            }        }    }

3.簡單選擇排序

常用于取序列中最大最小的幾個數時。

(如果每次比較都交換,那么就是交換排序;如果每次比較完一個循環再交換,就是簡單選擇排序。)

  1. 遍歷整個序列,將最小的數放在最前面。

  2. 遍歷剩下的序列,將最小的數放在最前面。

  3. 重復第二步,直到只剩下一個數。

05a7e3335915ce078a48033874048621.png

如何寫成代碼:

  1. 首先確定循環次數,并且記住當前數字和當前位置。

  2. 將當前位置后面所有的數與當前數字進行對比,小數賦值給key,并記住小數的位置。

  3. 比對完成后,將最小的值與第一個數的值交換。

  4. 重復2、3步。

代碼實現如下:

public void selectSort(int[] a) {        int length = a.length;        for (int i = 0; i < length; i++) {//循環次數            int key = a[i];            int position=i;            for (int j = i + 1; j < length; j++) {//選出最小的值和位置                if (a[j] < key) {                    key = a[j];                    position = j;                }            }            a[position]=a[i];//交換位置            a[i]=key;        }    }

4.堆排序

對簡單選擇排序的優化。

  1. 將序列構建成大頂堆。

  2. 將根節點與最后一個節點交換,然后斷開最后一個節點。

  3. 重復第一、二步,直到所有節點斷開。

89539fcce6b25136bfd2516ccf733d5b.png

代碼實現如下:

public  void heapSort(int[] a){        System.out.println("開始排序");        int arrayLength=a.length;        //循環建堆        for(int i=0;i-1;i++){            //建堆            buildMaxHeap(a,arrayLength-1-i);            //交換堆頂和最后一個元素            swap(a,0,arrayLength-1-i);            System.out.println(Arrays.toString(a));        }    }    private  void swap(int[] data, int i, int j) {        // TODO Auto-generated method stub        int tmp=data[i];        data[i]=data[j];        data[j]=tmp;    }    //對data數組從0到lastIndex建大頂堆    private void buildMaxHeap(int[] data, int lastIndex) {        // TODO Auto-generated method stub        //從lastIndex處節點(最后一個節點)的父節點開始        for(int i=(lastIndex-1)/2;i>=0;i--){            //k保存正在判斷的節點            int k=i;            //如果當前k節點的子節點存在            while(k*2+1<=lastIndex){                //k節點的左子節點的索引                int biggerIndex=2*k+1;                //如果biggerIndex小于lastIndex,即biggerIndex+1代表的k節點的右子節點存在                if(biggerIndex                    //若果右子節點的值較大                    if(data[biggerIndex]1]){                        //biggerIndex總是記錄較大子節點的索引                        biggerIndex++;                    }                }                //如果k節點的值小于其較大的子節點的值                if(data[k]                    //交換他們                    swap(data,k,biggerIndex);                    //將biggerIndex賦予k,開始while循環的下一次循環,重新保證k節點的值大于其左右子節點的值                    k=biggerIndex;                }else{                    break;                }            }        }    }

5.冒泡排序

一般不用。

  1. 將序列中所有元素兩兩比較,將最大的放在最后面。

  2. 將剩余序列中所有元素兩兩比較,將最大的放在最后面。

  3. 重復第二步,直到只剩下一個數。

90c641199537966710dbad2c15db5019.png

e43c8c29d82707ee68c2803e3531e3ac.png

如何寫成代碼:

  1. 設置循環次數。

  2. 設置開始比較的位數,和結束的位數。

  3. 兩兩比較,將最小的放到前面去。

  4. 重復2、3步,直到循環次數完畢。

代碼實現如下:

public void bubbleSort(int[] a){        int length=a.length;        int temp;        for(int i=0;i            for(int j=0;j-1;j++){                if(a[j]>a[j+1]){                    temp=a[j];                    a[j]=a[j+1];                    a[j+1]=temp;                }            }        }    }

6.快速排序

要求時間最快時。

  1. 選擇第一個數為p,小于p的數放在左邊,大于p的數放在右邊。

  2. 遞歸的將p左邊和右邊的數都按照第一步進行,直到不能遞歸。

f7625fc63301d5b718c48983d0931590.png

代碼實現如下:

public static void quickSort(int[] numbers, int start, int end) {    if (start < end) {        int base = numbers[start]; // 選定的基準值(第一個數值作為基準值)        int temp; // 記錄臨時中間值        int i = start, j = end;        do {            while ((numbers[i] < base) && (i < end))                i++;            while ((numbers[j] > base) && (j > start))                j--;            if (i <= j) {                temp = numbers[i];                numbers[i] = numbers[j];                numbers[j] = temp;                i++;                j--;            }        } while (i <= j);        if (start < j)            quickSort(numbers, start, j);        if (end > i)            quickSort(numbers, i, end);    }}

7.歸并排序

速度僅次于快排,內存少的時候使用,可以進行并行計算的時候使用。

  1. 選擇相鄰兩個數組成一個有序序列。

  2. 選擇相鄰的兩個有序序列組成一個有序序列。

  3. 重復第二步,直到全部組成一個有序序列。

f15b6dc055a63f6bb014bf3dc31b7b4d.png

代碼實現如下:

public static void mergeSort(int[] numbers, int left, int right) {    int t = 1;// 每組元素個數    int size = right - left + 1;    while (t < size) {        int s = t;// 本次循環每組元素個數        t = 2 * s;        int i = left;        while (i + (t - 1) < size) {            merge(numbers, i, i + (s - 1), i + (t - 1));            i += t;        }        if (i + (s - 1) < right)            merge(numbers, i, i + (s - 1), right);    }}private static void merge(int[] data, int p, int q, int r) {    int[] B = new int[data.length];    int s = p;    int t = q + 1;    int k = p;    while (s <= q && t <= r) {        if (data[s] <= data[t]) {            B[k] = data[s];            s++;        } else {            B[k] = data[t];            t++;        }        k++;    }    if (s == q + 1)        B[k++] = data[t++];    else          B[k++] = data[s++];    for (int i = p; i <= r; i++)        data[i] = B[i];}

8.基數排序

用于大量數,很長的數進行排序時。

  1. 將所有的數的個位數取出,按照個位數進行排序,構成一個序列。

  2. 將新構成的所有的數的十位數取出,按照十位數進行排序,構成一個序列。

00a2346c1cf5308f534a4d6c75115cf0.png

代碼實現如下:

public void sort(int[] array) {        //首先確定排序的趟數;        int max = array[0];        for (int i = 1; i < array.length; i++) {            if (array[i] > max) {                max = array[i];            }        }        int time = 0;        //判斷位數;        while (max > 0) {            max /= 10;            time++;        }        //建立10個隊列;        Listqueue = new ArrayList();        for (int i = 0; i < 10; i++) {            ArrayList queue1 = new ArrayList();            queue.add(queue1);        }        //進行time次分配和收集;        for (int i = 0; i < time; i++) {            //分配數組元素;            for (int j = 0; j < array.length; j++) {                //得到數字的第time+1位數;                int x = array[j] % (int) Math.pow(10, i + 1) / (int) Math.pow(10, i);                ArrayList queue2 = queue.get(x);                queue2.add(array[j]);                queue.set(x, queue2);            }            int count = 0;//元素計數器;            //收集隊列元素;            for (int k = 0; k < 10; k++) {                while (queue.get(k).size() > 0) {                    ArrayList queue3 = queue.get(k);                    array[count] = queue3.get(0);                    queue3.remove(0);                    count++;                }            }        }    }

今天就分享這么多于Java 代碼實現排序算法會了多少歡迎在留言區評論,對于有價值的留言,我們都會一一回復的。如果覺得文章對你有一丟丟幫助,請點右下角【在看】,讓更多人看到該文章。

90c641199537966710dbad2c15db5019.png

????db2a835ec0b856da6c59c3373b624234.gif

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/395128.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395128.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395128.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

移動游戲市場Testin云測占有率超過90%

《王者榮耀》、全民K歌、美團大眾、共享單車……越來越多的爆款應用占據著我們的手機桌面&#xff0c;也驅動著創業者不斷發掘新的移動應用和商業模式&#xff0c;卻鮮有人留意到&#xff0c;由移動應用催生出來的APP測試市場。 “現在用戶獲取成本是幾年前的幾十倍&#xff0c…

java 拆箱_Java自動裝箱拆箱

一、裝箱、拆箱定義如果一個int型量被傳遞到需要一個Integer對象的地方&#xff0c;那么&#xff0c;編譯器將在幕后插入一個對Integer構造方法的調用&#xff0c;這就叫做自動裝箱。而如果一個Integer對象被放到需要int型量的地方&#xff0c;則編譯器將幕后插入一個隊intValu…

我們如何使用CircleCI 2.0來構建Angular應用并將其部署到AWS S3

by Marius Lazar通過馬里烏斯拉扎爾(Marius Lazar) 我們如何使用CircleCI 2.0來構建Angular應用并將其部署到AWS S3 (How we used CircleCI 2.0 to build and deploy an Angular app to AWS S3) In today’s world, continuous integration and deployment (CI & CD) is a…

攜手助力新型智慧城市建設和科技創新發展

2017年5月9日&#xff0c;三門峽市政府與北京航天控制儀器研究所、溢思得瑞科技創新集團戰略合作協議簽約儀式舉行&#xff0c;共同推動三門峽市新型智慧城市建設和科技創新發展。 市委書記劉南昌&#xff0c;市委常委、宣傳部部長呂挺琳&#xff0c;副市長李琳&#xff0c;市城…

在采用vue-cli Post Get

需要依賴插件 vue-resource npm install vue-resource --save https://cn.vuejs.org/v2/cookbook/using-axios-to-consume-apis.html 采用axios一樣可以取數值 new Vue({ el: #app, data () { return { info: null } }, mounted () { axios .get(https://api.coindesk.com/v1/b…

優秀的開源項目C_適合提高C/C++、網絡編程能力的開源項目!不要錯過,趕緊收藏...

我們學習每一個編程語言都是有一個項目實戰的過程&#xff0c;而對于開發類的編程語言&#xff0c;除了適當的做項目程序外&#xff0c;學習了解其他的開源項目更是一個關鍵&#xff0c;就比如我們的C/C編程語言的學習。前陣子有一個小伙伴就問到我&#xff0c;我學好C/C基礎后…

Opencv分水嶺算法——watershed自動圖像分割用法

分水嶺算法是一種圖像區域分割法&#xff0c;在分割的過程中&#xff0c;它會把跟臨近像素間的相似性作為重要的參考依據&#xff0c;從而將在空間位置上相近并且灰度值相近的像素點互相連接起來構成一個封閉的輪廓&#xff0c;封閉性是分水嶺算法的一個重要特征。 其他圖像分割…

單變量線性回歸模型_了解如何為單變量模型選擇效果最好的線性回歸

單變量線性回歸模型by Bjrn Hartmann比約恩哈特曼(BjrnHartmann) 找出哪種線性回歸模型最適合您的數據 (Find out which linear regression model is the best fit for your data) Inspired by a question after my previous article, I want to tackle an issue that often c…

java javax.xml.ws_如何通過javax.xml.ws.Service進行調用

在Eclipse中創建了一個新的標準java 7項目,并成功設法獲取javax.xml.ws.Service的實例,如下所示&#xff1a;String wsdlURL "http://example.com:3000/v1_0/foo/bar/SomeService?wsdl";String namespace "http://foo.bar.com/webservice";String servi…

漢能:讓人類像葉綠素一樣利用太陽能

6月初&#xff0c;一批在車筐里同時標識了摩拜“Mobike”和漢能“Hanergy”的摩拜單車在北京投入使用。這是由漢能與摩拜合作開發的第一批裝有漢能薄膜太陽能組件的共享單車。 這批共享單車所裝載的5.5瓦的漢能MiaSol的柔性薄膜太陽能組件&#xff0c;將為摩拜車載智能鎖中內置…

Java Annotation

一、了解注釋注釋是java1.5 jdk這后引入的特性。Java庫自己帶的注釋有Deprecated, Overwrite等。注釋是加在類&#xff0c;方法&#xff0c;變量等上的一種標記。并且&#xff0c;可以通過javaj反射操作把這個標記取出來。主要用途是用于對方法&#xff0c;變量&#xff0c;類等…

pycharm顯示全部數據_PyCharm第一次安裝及使用教程

pycharm簡介PyCharm是一種Python IDE&#xff0c;帶有一整套可以幫助用戶在使用Python語言開發時提高其效率的工具&#xff0c;比如調試、語法高亮、Project管理、代碼跳轉、智能提示、自動完成、單元測試、版本控制。此外&#xff0c;該IDE提供了一些高級功能&#xff0c;以用…

UOJ #150 【NOIP2015】 運輸計劃

題目描述 公元 \(2044\) 年&#xff0c;人類進入了宇宙紀元。 \(L\) 國有 \(n\) 個星球&#xff0c;還有 \(n-1\) 條雙向航道&#xff0c;每條航道建立在兩個星球之間&#xff0c;這 \(n-1\) 條航道連通了 \(L\) 國的所有星球。 小 \(P\) 掌管一家物流公司&#xff0c; 該公司有…

css 屬性選擇器筆記

1、基本選擇器&#xff1a; eg&#xff1a; *{margin:0;padding:0}p{color:black}.content{background:red;}#intro{padding-left:2em;} 2、多元素組合選擇器 div p { color:#f00; }#nav li { display:inline; }#nav a { font-weight:bold; }div > strong { color:#f00; }h2…

scuba 報表_是否想了解JavaScript的for循環? 這個動畫的SCUBA潛水員可以提供幫助!...

scuba 報表by Kevin Kononenko凱文科諾年科(Kevin Kononenko) 是否想了解JavaScript的for循環&#xff1f; 這個動畫的SCUBA潛水員可以提供幫助&#xff01; (Want to learn about JavaScript’s for loops? This animated SCUBA diver can help!) For loops can be tough to…

力扣——尋找兩個有序數組的中位數

給定兩個大小為 m 和 n 的有序數組 nums1 和 nums2。 請你找出這兩個有序數組的中位數&#xff0c;并且要求算法的時間復雜度為 O(log(m n))。 你可以假設 nums1 和 nums2 不會同時為空。 示例 1: nums1 [1, 3] nums2 [2]則中位數是 2.0示例 2: nums1 [1, 2] nums2 [3, 4]…

uva-10152-烏龜排序

uva-10152-烏龜排序 求從待排序的到期望的順序的最小操作順序,只能進行一個操作,將當前的烏龜拿出來,上面的下移,拿出來的放到最上面 發現voj沒有PE, 解題方法,把倆個串反過來使用,從期望的順序到待排序的順序. AC:170ms #include <iostream> #include<stdio.h> #i…

筆記本win10玩紅警黑屏_【買筆記本電腦差評真的有參考意義?】

每次推薦筆記本電腦都會遇到一個重要的問題就是&#xff1a;“大多數消費者會下意識的去看京東評論&#xff0c;參考買的人是怎么說的&#xff0c;往往會出現不懂電腦的人繼續誤導不懂的人&#xff0c;導致越來越多的人被誤導”本文聊聊關于京東評論究竟有沒有參考價值。1&…

2.sed命令

2.sed命令 sed基本用法&#xff1a; sed: Stream EDitor 行編輯器 (全屏編輯器: vi) sed: 模式空間 默認不編輯原文件&#xff0c;僅對模式空間中的數據做處理&#xff1b;而后&#xff0c;處理結束后&#xff0c;將模式空間打印至屏幕&#xff1b; sed [options] AddressComma…

因此,您是一名新軟件工程師。 讓我們面對一些事實,揭穿一些神話。

by Trey Huffine通過Trey Huffine 因此&#xff0c;您是一名新軟件工程師。 讓我們面對一些事實&#xff0c;揭穿一些神話。 (So you’re a new Software Engineer. Let’s face some facts and debunk some myths.) When we’re learning to become software engineers, we’…