欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java?常見排序算法代碼分享

 更新時間:2022年03月23日 12:03:27   作者:多氯環(huán)己烷  
這篇文章主要介紹了Java?常見排序算法代碼分享,文章通過分享詳細(xì)的代碼總結(jié)文章內(nèi)容,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你有所幫助

匯總:

1. 冒泡排序

每輪循環(huán)確定最值;

public void bubbleSort(int[] nums){
? ? int temp;
? ? boolean isSort = false; //優(yōu)化,發(fā)現(xiàn)排序好就退出
? ? for (int i = 0; i < nums.length-1; i++) {
? ? ? ? for (int j = 0; j < nums.length-1-i; j++) { ?//每次排序后能確定較大值
? ? ? ? ? ? if(nums[j] > nums[j+1]){
? ? ? ? ? ? ? ? isSort = true;
? ? ? ? ? ? ? ? temp = nums[j];
? ? ? ? ? ? ? ? nums[j] = nums[j+1];
? ? ? ? ? ? ? ? nums[j+1] = temp;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? if(!isSort){
? ? ? ? ? ? return;
? ? ? ? } else {
? ? ? ? ? ? isSort = false;
? ? ? ? }
? ? }
}

2. 選擇排序

每次選出最值,再交換到邊上;

public void selectSort(int[] nums){
? ? for (int i = 0; i < nums.length-1; i++) {
? ? ? ? int index = i;
? ? ? ? int minNum = nums[i];
? ? ? ? for (int j = i+1; j < nums.length; j++) {
? ? ? ? ? ? if(nums[j] < minNum){
? ? ? ? ? ? ? ? minNum = nums[j];
? ? ? ? ? ? ? ? index = j;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? if(index != i){
? ? ? ? ? ? nums[index] = nums[i];
? ? ? ? ? ? nums[i] = minNum;
? ? ? ? }
? ? }
}

3. 插入排序

對循環(huán)的每個數(shù)找到屬于自己的位置插入;

public void insertionSort(int[] nums){
? ? for (int i = 1; i < nums.length; i++) {
? ? ? ? int j = i;
? ? ? ? int insertNum = nums[i];
? ? ? ? while(j-1 >= 0 && nums[j-1] > insertNum){
? ? ? ? ? ? nums[j] = nums[j-1];
? ? ? ? ? ? j--;
? ? ? ? }
? ? ? ? nums[j] = insertNum;
? ? }
}

4. 快速排序

選一個基本值,小于它的放一邊,大于它的放另一邊;

public void quickSortDfs(int[] nums, int left, int right){
? ? if(left > right){
? ? ? ? return;
? ? }
? ? int l = left;
? ? int r = right;
? ? int baseNum = nums[left];
? ? while(l < r){
? ? ? ? //必須右邊先走
? ? ? ? while(nums[r] >= baseNum && l < r){
? ? ? ? ? ? r--;
? ? ? ? }
? ? ? ? while(nums[l] <= baseNum && l < r){
? ? ? ? ? ? l++;
? ? ? ? }
? ? ? ? int temp = nums[l];
? ? ? ? nums[l] = nums[r];
? ? ? ? nums[r] = temp;
? ? }
? ? nums[left] = nums[l];
? ? nums[l] = baseNum;
? ? quickSortDfs(nums, left, r-1);
? ? quickSortDfs(nums, l+1, right);
}

5. 歸并排序

分治算法;

//歸
public void mergeSortDfs(int[] nums, int l, int r){
? ? if(l >= r){
? ? ? ? return;
? ? }
? ? int m = (l+r)/2;
? ? mergeSortDfs(nums, l, m);
? ? mergeSortDfs(nums, m+1, r);
? ? merge(nums, l, m, r);
}
//并
private void merge(int[] nums, int left, int mid, int right){
? ? int[] temp = new int[right-left+1];
? ? int l = left;
? ? int m = mid+1;
? ? int i = 0;
? ? while(l <= mid && m <= right){
? ? ? ? if(nums[l] < nums[m]){
? ? ? ? ? ? temp[i++] = nums[l++];
? ? ? ? } else {
? ? ? ? ? ? temp[i++] = nums[m++];
? ? ? ? }
? ? }
? ? while(l <= mid){
? ? ? ? temp[i++] = nums[l++];
? ? }
? ? while(m <= right){
? ? ? ? temp[i++] = nums[m++];
? ? }
? ? System.arraycopy(temp, 0, nums, left, temp.length);
}

6. 希爾排序

引入步長減少數(shù)字交換次數(shù)提高效率;

6.1 希爾-冒泡排序(慢)

public void shellBubbleSort(int[] nums){
? ? for (int step = nums.length/2; step > 0 ; step /= 2) {
? ? ? ? for (int i = step; i < nums.length; i++) {
? ? ? ? ? ? for (int j = i-step; j >= 0; j -= step) {
? ? ? ? ? ? ? ? if(nums[j] > nums[j+step]){
? ? ? ? ? ? ? ? ? ? int temp = nums[j];
? ? ? ? ? ? ? ? ? ? nums[j] = nums[j+step];
? ? ? ? ? ? ? ? ? ? nums[j+step] = temp;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

6.2 希爾-插入排序(快)

public void shellInsertSort(int[] nums){
? ? for (int step = nums.length/2; step > 0; step /= 2) {
? ? ? ? for (int i = step; i < nums.length; i++) {
? ? ? ? ? ? int j = i;
? ? ? ? ? ? int insertNum = nums[i];
? ? ? ? ? ? while(j-step >= 0 && nums[j-step] > insertNum){
? ? ? ? ? ? ? ? nums[j] = nums[j-step];
? ? ? ? ? ? ? ? j-=step;
? ? ? ? ? ? }
? ? ? ? ? ? nums[j] = insertNum;
? ? ? ? }
? ? }
}

7. 堆排序

大頂堆實現(xiàn)升序,每次將最大值移到堆的最后一個位置上;

public void heapSort2(int[] nums) {
? ? for(int i = nums.length/2-1; i >= 0; i--){
? ? ? ? sift(nums, i, nums.length);
? ? }
? ? for (int i = nums.length-1; i > 0; i--) {
? ? ? ? int temp = nums[0];
? ? ? ? nums[0] = nums[i];
? ? ? ? nums[i] = temp;
? ? ? ? sift(nums, 0, i);
? ? }
}
private void sift(int[] nums, int parent, int len) {
? ? int value = nums[parent];
? ? for (int child = 2*parent +1; child < len; child = child*2 +1) {
? ? ? ? if(child+1 < len && nums[child+1] > nums[child]){
? ? ? ? ? ? child++;
? ? ? ? }
? ? ? ? if(nums[child] > value){
? ? ? ? ? ? nums[parent] = nums[child];
? ? ? ? ? ? parent = child;
? ? ? ? } else {
? ? ? ? ? ? break;
? ? ? ? }
? ? }
? ? nums[parent] = value;
}

8. 計數(shù)排序

按順序統(tǒng)計每個數(shù)出現(xiàn)次數(shù);

public void countSort(int[] nums){
? ? int max = Integer.MIN_VALUE;
? ? int min = Integer.MAX_VALUE;
? ? for(int num : nums){
? ? ? ? max = Math.max(max, num);
? ? ? ? min = Math.min(min, num);
? ? }

? ? int[] countMap = new int[max-min+1];
? ? for(int num : nums){
? ? ? ? countMap[num-min]++;
? ? }
? ? int i = 0;
? ? int j = 0;
? ? while(i < nums.length && j < countMap.length){
? ? ? ? if(countMap[j] > 0){
? ? ? ? ? ? nums[i] = j+min;
? ? ? ? ? ? i++;
? ? ? ? ? ? countMap[j]--;
? ? ? ? } else {
? ? ? ? ? ? j++;
? ? ? ? }
? ? }
}

9. 桶排序

類似計數(shù)排序,不同點在于統(tǒng)計的是某個區(qū)間(桶)里的數(shù);

public void bucketSort(int[] nums){
? ? int max = Integer.MIN_VALUE;
? ? int min = Integer.MAX_VALUE;
? ? for(int num : nums){
? ? ? ? max = Math.max(max, num);
? ? ? ? min = Math.min(min, num);
? ? }
? ? int bucketCount = (max-min)/nums.length+1;
? ? List<List<Integer>> bucketList = new ArrayList<>();
? ? for (int i = 0; i < bucketCount; i++) {
? ? ? ? bucketList.add(new ArrayList<>());
? ? }

? ? for(int num : nums){
? ? ? ? int index = (num-min)/nums.length;
? ? ? ? bucketList.get(index).add(num);
? ? }
? ? for(List<Integer> bucket : bucketList){
? ? ? ? Collections.sort(bucket);
? ? }

? ? int j = 0;
? ? for(List<Integer> bucket : bucketList){
? ? ? ? for(int num : bucket){
? ? ? ? ? ? nums[j] = num;
? ? ? ? ? ? j++;
? ? ? ? }
? ? }
}

10. 基數(shù)排序

按個、十、百位依次歸類排序;

public ?void radixSort(int[] nums){
? ? int min = Integer.MAX_VALUE;
? ? int max = Integer.MIN_VALUE;
? ? for (int num : nums) {
? ? ? ? min = Math.min(min, num);
? ? ? ? max = Math.max(max, num);
? ? }
? ? for (int i = 0; i < nums.length; i++) {
? ? ? ? nums[i] -= min;
? ? }
? ? max -= min;
? ? int maxLen = (max+"").length();

? ? int[][] bucket = new int[nums.length][10];
? ? int[] bucketCount = new int[10];

? ? for (int i = 0, n = 1; i < maxLen; i++, n*=10) {
? ? ? ? for (int num : nums) {
? ? ? ? ? ? int digitVal = num / n % 10;
? ? ? ? ? ? bucket[bucketCount[digitVal]][digitVal] = num;
? ? ? ? ? ? bucketCount[digitVal]++;
? ? ? ? }
? ? ? ? int index = 0;
? ? ? ? for (int j = 0; j < bucketCount.length; j++) {
? ? ? ? ? ? if(bucketCount[j] > 0){
? ? ? ? ? ? ? ? for (int k = 0; k < bucketCount[j]; k++) {
? ? ? ? ? ? ? ? ? ? nums[index] = bucket[k][j];
? ? ? ? ? ? ? ? ? ? index++;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? bucketCount[j] = 0;
? ? ? ? }
? ? }
? ? for (int i = 0; i < nums.length; i++) {
? ? ? ? nums[i] += min;
? ? }
}

11. 使用集合或 API

11.1 優(yōu)先隊列

public void priorityQueueSort(int[] nums){
? ? PriorityQueue<Integer> queue = new PriorityQueue<>();
? ? for(int num : nums){
? ? ? ? queue.offer(num);
? ? }
? ? for (int i = 0; i < nums.length; i++) {
? ? ? ? nums[i] = queue.poll();
? ? }
}

11.2 Java API

public void arraysApiSort(int[] nums){
? ? Arrays.sort(nums);
}

到此這篇關(guān)于Java 常見排序算法代碼分享的文章就介紹到這了,更多相關(guān)Java 常見排序算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Lucene fnm索引文件格式源碼解析

    Lucene fnm索引文件格式源碼解析

    這篇文章主要為大家介紹了Lucene fnm索引文件格式源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 簡單了解mybatis攔截器實現(xiàn)原理及實例

    簡單了解mybatis攔截器實現(xiàn)原理及實例

    這篇文章主要介紹了簡單了解mybatis攔截器實現(xiàn)原理及實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • RabbitMQ 最常用的三大模式實例解析

    RabbitMQ 最常用的三大模式實例解析

    這篇文章主要介紹了RabbitMQ 最常用的三大模式實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • java使用ArrayList遍歷及效率比較實例分析

    java使用ArrayList遍歷及效率比較實例分析

    這篇文章主要介紹了java使用ArrayList遍歷及效率比較,實例分析了ArrayList遍歷的方法與使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • MybatisPlus 插入或更新數(shù)據(jù)時自動填充更新數(shù)據(jù)解決方案

    MybatisPlus 插入或更新數(shù)據(jù)時自動填充更新數(shù)據(jù)解決方案

    本文主要介紹了MybatisPlus 插入或更新數(shù)據(jù)時自動填充更新數(shù)據(jù)解決方案,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java創(chuàng)建和填充PDF表單域方法

    Java創(chuàng)建和填充PDF表單域方法

    在本篇文章中小編給大家分享了關(guān)于Java創(chuàng)建和填充PDF表單域方法和步驟,有需要的朋友們學(xué)習(xí)下。
    2019-01-01
  • Java中switch的三種用法方式

    Java中switch的三種用法方式

    這篇文章主要介紹了Java中switch的三種用法方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 舉例講解設(shè)計模式中的訪問者模式在Java編程中的運用

    舉例講解設(shè)計模式中的訪問者模式在Java編程中的運用

    這篇文章主要介紹了舉例講解設(shè)計模式中的訪問者模式在Java編程中的運用,訪問者模式是一種將算法與對象結(jié)構(gòu)分離的軟件設(shè)計模式,需要的朋友可以參考下
    2016-05-05
  • Java遞歸實現(xiàn)評論多級回復(fù)功能

    Java遞歸實現(xiàn)評論多級回復(fù)功能

    這篇文章主要介紹了Java遞歸實現(xiàn)評論多級回復(fù)功能,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • SpringBoot跨域問題的解決方法實例

    SpringBoot跨域問題的解決方法實例

    這篇文章主要給大家介紹了關(guān)于SpringBoot跨域問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05

最新評論