1. 冒泡排序每轮循环确定最值;
public void bubblesort(int[] nums){ int temp; boolean issort = false; //优化,发现排序好就退出 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. 插入排序对循环的每个数找到属于自己的位置插入;
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. 希尔排序引入步长减少数字交换次数提高效率;
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. 堆排序大顶堆实现升序,每次将最大值移到堆的最后一个位置上;
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. 计数排序按顺序统计每个数出现次数;
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. 桶排序类似计数排序,不同点在于统计的是某个区间(桶)里的数;
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. 基数排序按个、十、百位依次归类排序;
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. 使用集合或 api11.1 优先队列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 apipublic void arraysapisort(int[] nums){ arrays.sort(nums);}
以上就是java常见排序算法怎么实现的详细内容。
