java 算法 6種排序小結(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-07
Java 數(shù)據(jù)庫(kù)連接池 Tomcat介紹
這篇文章主要給大家分享了 Java 數(shù)據(jù)庫(kù)連接池 Tomcat介紹,omcat 是一個(gè)小型的輕量級(jí)應(yīng)用服務(wù)器,在中小型系統(tǒng)和并發(fā)訪(fǎng)問(wèn)用戶(hù)不是很多的場(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-03
SpringBoot配置logback.xml 多環(huán)境的操作步驟
最近在研究springboot的日志,所以記錄一下,做一下總結(jié),今天重點(diǎn)給大家介紹SpringBoot配置logback.xml 多環(huán)境的操作步驟,要實(shí)現(xiàn)多環(huán)境的配置,主要是依賴(lài)于springboot的application.yml文件去實(shí)現(xiàn),感興趣的朋友跟隨小編一起看看吧2021-05-05
Spring 多線(xiàn)程事務(wù)控制的實(shí)踐
本文主要介紹了Spring 多線(xiàn)程事務(wù)控制的實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09

