Java?常見排序算法代碼分享
匯總:
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)文章
MybatisPlus 插入或更新數(shù)據(jù)時自動填充更新數(shù)據(jù)解決方案
本文主要介紹了MybatisPlus 插入或更新數(shù)據(jù)時自動填充更新數(shù)據(jù)解決方案,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09舉例講解設(shè)計模式中的訪問者模式在Java編程中的運用
這篇文章主要介紹了舉例講解設(shè)計模式中的訪問者模式在Java編程中的運用,訪問者模式是一種將算法與對象結(jié)構(gòu)分離的軟件設(shè)計模式,需要的朋友可以參考下2016-05-05