java 算法 6種排序小結(jié)
更新時(shí)間:2021年10月18日 09:51:44 作者:java菜鳥(niǎo)231
這篇文章主要介紹了java 算法 6種排序,排序原理及實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
冒泡排序
package 冒泡排序; import java.util.Arrays; public class Bubble { /** * 對(duì)數(shù)組a中的元素進(jìn)行排序 * @param a */ public static int[] sort(int[] a){ for (int i=a.length-1;i>0;i--){ for (int j=0;j<i;j++){ if(greater(a[j],a[j+1])){ exch(a,j,j+1); } } } return a; } /** * 比較v元素是否大于w元素 * @param v * @param w * @return */ private static Boolean greater(int v,int w){ if (v>=w){ return true; } return false; } /** * 數(shù)據(jù)元素i和j交換位置 * @param a * @param i * @param j */ private static void exch(int[] a,int i,int j){ int t=a[i]; a[i]=a[j]; a[j]=t; } public static void main(String[] args) { int[] a={4,5,6,3,2,1}; int[] sort = Bubble.sort(a); System.out.println(Arrays.toString(sort)); } }
選擇排序
package cn.itcast.algorithm.sort; /** * 選擇排序 */ public class Selection { /* 對(duì)數(shù)組a中的元素進(jìn)行排序 */ public static void sort(Comparable[] a){ for(int i=0;i<=a.length-2;i++){ //定義一個(gè)變量,記錄最小元素所在的索引,默認(rèn)為參與選擇排序的第一個(gè)元素所在的位置 int minIndex = i; for(int j=i+1;j<a.length;j++){ //需要比較最小索引minIndex處的值和j索引處的值; if (greater(a[minIndex],a[j])){ minIndex=j; } } //交換最小元素所在索引minIndex處的值和索引i處的值 exch(a,i,minIndex); } } /* 比較v元素是否大于w元素 */ private static boolean greater(Comparable v,Comparable w){ return v.compareTo(w)>0; } /* 數(shù)組元素i和j交換位置 */ private static void exch(Comparable[] a,int i,int j){ Comparable temp; temp = a[i]; a[i]=a[j]; a[j]=temp; } }
插入排序
package 插入排序; import java.util.Arrays; public class Insertion { public static void sort(int[] a){ for (int i=1;i<a.length;i++){ //當(dāng)前元素為a[i],依次和i前面的元素比較,找到一個(gè)小于a[i]的元素 for (int j=i;j>0;j--){ if (greater(a[j-1],a[j])){ exch(a,j-1,j); }else { break; } } } } /** * 比較v元素是否大于w元素 * @param v * @param w * @return */ private static Boolean greater(int v,int w){ if (v>=w){ return true; } return false; } /** * 數(shù)據(jù)元素i和j交換位置 * @param a * @param i * @param j */ private static void exch(int[] a,int i,int j){ int t=a[i]; a[i]=a[j]; a[j]=t; } public static void main(String[] args) { int[] a={4,3,2,10,12,1,5,6}; Insertion.sort(a); System.out.println(Arrays.toString(a)); } }
希爾排序
package 希爾排序; import java.util.Arrays; public class Shell { /* 對(duì)數(shù)組a中的元素進(jìn)行排序 */ public static void sort(Comparable[] a) { int N = a.length; //確定增長(zhǎng)量h的最大值 int h = 1; while (h < N / 2) { h = h * 2 + 1; } //當(dāng)增長(zhǎng)量h小于1,排序結(jié)束 while (h >= 1) { //找到待插入的元素 for (int i = h; i < N; i++) { //a[i]就是待插入的元素 //把a(bǔ)[i]插入到a[i-h],a[i-2h],a[i-3h]...序列中 for (int j = i; j >= h; j -= h) { //a[j]就是待插入元素,依次和a[j-h],a[j-2h],a[j-3h]進(jìn)行比較,如果a[j]小,那么交換位置,如果不小于,a[j] 大,則插入完成。 if (greater(a[j - h], a[j])) { exch(a, j, j - h); } else { break; } } } h /= 2; } } /* 比較v元素是否大于w元素 */ private static boolean greater(Comparable v, Comparable w) { return v.compareTo(w) > 0; } /* 數(shù)組元素i和j交換位置 */ private static void exch(Comparable[] a, int i, int j) { Comparable t = a[i]; a[i] = a[j]; a[j] = t; } //測(cè)試代碼 public static void main(String[] args) { Integer[] a = {9, 1, 2, 5, 7, 4, 8, 6, 3, 5}; Shell.sort(a); System.out.println(Arrays.toString(a)); } }
歸并排序
package 歸并排序; import java.util.Arrays; public class Merge { private static Comparable[] assist;//歸并所需要的輔助數(shù)組 /* 對(duì)數(shù)組a中的元素進(jìn)行排序 */ public static void sort(Comparable[] a) { assist = new Comparable[a.length]; int lo = 0; int hi = a.length - 1; sort(a, lo, hi); } /* 對(duì)數(shù)組a中從lo到hi的元素進(jìn)行排序 */ private static void sort(Comparable[] a, int lo, int hi) { if (hi <= lo) { return; } int mid = lo + (hi - lo) / 2; //對(duì)lo到mid之間的元素進(jìn)行排序; sort(a, lo, mid); //對(duì)mid+1到hi之間的元素進(jìn)行排序; sort(a, mid + 1, hi); //對(duì)lo到mid這組數(shù)據(jù)和mid到hi這組數(shù)據(jù)進(jìn)行歸并 merge(a, lo, mid, hi); } /* 對(duì)數(shù)組中,從lo到mid為一組,從mid+1到hi為一組,對(duì)這兩組數(shù)據(jù)進(jìn)行歸并 */ private static void merge(Comparable[] a, int lo, int mid, int hi) { //lo到mid這組數(shù)據(jù)和mid+1到hi這組數(shù)據(jù)歸并到輔助數(shù)組assist對(duì)應(yīng)的索引處 int i = lo;//定義一個(gè)指針,指向assist數(shù)組中開(kāi)始填充數(shù)據(jù)的索引 int p1 = lo;//定義一個(gè)指針,指向第一組數(shù)據(jù)的第一個(gè)元素 int p2 = mid + 1;//定義一個(gè)指針,指向第二組數(shù)據(jù)的第一個(gè)元素 //比較左邊小組和右邊小組中的元素大小,哪個(gè)小,就把哪個(gè)數(shù)據(jù)填充到assist數(shù)組中 while (p1 <= mid && p2 <= hi) { if (less(a[p1], a[p2])) { assist[i++] = a[p1++]; } else { assist[i++] = a[p2++]; } } //上面的循環(huán)結(jié)束后,如果退出循環(huán)的條件是p1<=mid,則證明左邊小組中的數(shù)據(jù)已經(jīng)歸并完畢,如果退 //出循環(huán)的條件是p2 <= hi, 則證明右邊小組的數(shù)據(jù)已經(jīng)填充完畢; //所以需要把未填充完畢的數(shù)據(jù)繼續(xù)填充到assist中,//下面兩個(gè)循環(huán),只會(huì)執(zhí)行其中的一個(gè) while (p1 <= mid) { assist[i++] = a[p1++]; } while (p2 <= hi) { assist[i++] = a[p2++]; } //到現(xiàn)在為止,assist數(shù)組中,從lo到hi的元素是有序的,再把數(shù)據(jù)拷貝到a數(shù)組中對(duì)應(yīng)的索引處 for (int index = lo; index <= hi; index++) { a[index] = assist[index]; } } /* 比較v元素是否小于w元素 */ private static boolean less(Comparable v, Comparable w) { return v.compareTo(w) < 0; } /* 數(shù)組元素i和j交換位置 */ private static void exch(Comparable[] a, int i, int j) { Comparable t = a[i]; a[i] = a[j]; a[j] = t; } //測(cè)試代碼 public static void main(String[] args) throws Exception { Integer[] arr = {8, 4, 5, 7, 1, 3, 6, 2}; Merge.sort(arr); System.out.println(Arrays.toString(arr)); } }
快速排序
package 快速排序; import java.util.Arrays; public class Quick { public static void sort(Comparable[] a) { int lo = 0; int hi = a.length - 1; sort(a, lo, hi); } private static void sort(Comparable[] a, int lo, int hi) { if (hi <= lo) { return; } //對(duì)a數(shù)組中,從lo到hi的元素進(jìn)行切分 int partition = partition(a, lo, hi); //對(duì)左邊分組中的元素進(jìn)行排序 //對(duì)右邊分組中的元素進(jìn)行排序 sort(a, lo, partition - 1); sort(a, partition + 1, hi); } public static int partition(Comparable[] a, int lo, int hi) { Comparable key = a[lo];//把最左邊的元素當(dāng)做基準(zhǔn)值 int left = lo;//定義一個(gè)左側(cè)指針,初始指向最左邊的元素 int right = hi + 1;//定義一個(gè)右側(cè)指針,初始指向左右側(cè)的元素下一個(gè)位置 //進(jìn)行切分 while (true) { //先從右往左掃描,找到一個(gè)比基準(zhǔn)值小的元素 while (less(key, a[--right])) {//循環(huán)停止,證明找到了一個(gè)比基準(zhǔn)值小的元素 if (right == lo) { break;//已經(jīng)掃描到最左邊了,無(wú)需繼續(xù)掃描 } } //再?gòu)淖笸覓呙?,找一個(gè)比基準(zhǔn)值大的元素 while (less(a[++left], key)) {//循環(huán)停止,證明找到了一個(gè)比基準(zhǔn)值大的元素 if (left == hi) { break;//已經(jīng)掃描到了最右邊了,無(wú)需繼續(xù)掃描 } } if (left >= right) { //掃描完了所有元素,結(jié)束循環(huán) break; } else { //交換left和right索引處的元素 exch(a, left, right); } } //交換最后rigth索引處和基準(zhǔn)值所在的索引處的值 exch(a, lo, right); return right;//right就是切分的界限 } /* 數(shù)組元素i和j交換位置 */ private static void exch(Comparable[] a, int i, int j) { Comparable t = a[i]; a[i] = a[j]; a[j] = t; } /* 比較v元素是否小于w元素 */ private static boolean less(Comparable v, Comparable w) { return v.compareTo(w) < 0; } //測(cè)試代碼 public static void main(String[] args) throws Exception { Integer[] arr = {6, 1, 2, 7, 9, 3, 4, 5, 8}; Quick.sort(arr); System.out.println(Arrays.toString(arr)); } }
到此這篇關(guān)于java 算法 6種排序的文章就介紹到這了,更多相關(guān)java 算法排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決Intellij IDEA 使用Spring-boot-devTools無(wú)效的問(wèn)題
下面小編就為大家?guī)?lái)一篇解決Intellij IDEA 使用Spring-boot-devTools無(wú)效的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07Java 數(shù)據(jù)庫(kù)連接池 Tomcat介紹
這篇文章主要給大家分享了 Java 數(shù)據(jù)庫(kù)連接池 Tomcat介紹,omcat 是一個(gè)小型的輕量級(jí)應(yīng)用服務(wù)器,在中小型系統(tǒng)和并發(fā)訪問(wèn)用戶不是很多的場(chǎng)合下被普遍使用,是開(kāi)發(fā)和調(diào)試JSP 程序的首選。下面來(lái)看看文章內(nèi)容的詳細(xì)介紹吧2021-11-11關(guān)于mybatis-plus插件使用時(shí)的一些問(wèn)題小結(jié)
這篇文章主要給大家介紹了關(guān)于mybatis-plus插件使用時(shí)的一些問(wèn)題的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-03-03SpringBoot配置logback.xml 多環(huán)境的操作步驟
最近在研究springboot的日志,所以記錄一下,做一下總結(jié),今天重點(diǎn)給大家介紹SpringBoot配置logback.xml 多環(huán)境的操作步驟,要實(shí)現(xiàn)多環(huán)境的配置,主要是依賴于springboot的application.yml文件去實(shí)現(xiàn),感興趣的朋友跟隨小編一起看看吧2021-05-05