排序算法
- 冒泡排序
/*** 冒泡排序* @param num*/public void bubbleSort(int[] num){for (int i = 0; i < num.length; i++) {for (int j = 0; j < num.length-i-1; j++) {if(num[j]>num[j+1]){int temp = num[j];num[j] = num[j+1];num[j+1] = temp;}}}}
- 选择排序
/*** 选择排序* @param nums*/public void selectSort(int[] nums){for (int i = 0; i < nums.length; i++) {int minIndex = i;for (int j = i; j < nums.length; j++) {if(nums[j]<nums[minIndex]){minIndex = j; //更新最小值的下标}}//将当前元素与目前最小值交换int temp = nums[minIndex];nums[minIndex] = nums[i];nums[i] = temp;}}
- 插入排序
/*** 直接插入排序* @param nums*/public void insertSort(int[] nums){int n = nums.length;for(int i=1;i<n;i++){//待排序元素小于有序序列的最后一个元素时,向前插入if(nums[i]<nums[i-1]){int temp = nums[i]; //待排序元素for(int j=i;j>=0;j--){if(j>0&&nums[j-1]>temp){nums[j] = nums[j-1]; //元素后移}else{nums[j] = temp; //放在合适的位置break;}}}}}
- 希尔排序
/*** 希尔排序* @param nums*/public void shellSort(int[] nums){int len = nums.length;int d = len/2; //增量while(d>0) {//一趟排序for (int i = d;i<len;i++) {for (int j = i;j>=d;j-=d) {if (nums[j] < nums[j-d]) {int temp = nums[j - d];nums[j - d] = nums[j];nums[j] = temp;}}}d /= 2;//每次增量减半}}
- 堆排序 ```java import java.io.; import java.util.; import java.text.; import java.math.; import java.util.regex.*;
public class Main{ public void heapSort(int[] nums){ int len = nums.length; //构建大顶堆 for(int i=len/2-1;i>=0;i—) { adjustHeap(nums,i,len); } System.out.println(Arrays.toString(nums)); for (int j=len-1;j>0;j—) { //交换堆顶和最后一个元素 int temp = nums[0]; nums[0] = nums[j]; nums[j] = temp; //调整堆,注意不能取到最后一个元素 adjustHeap(nums,0,j); } }
//调整堆public void adjustHeap(int[] nums,int i,int len){int temp = nums[i];//沿关键字较大的孩子节点向下筛选for(int j=i*2+1;j<len;j=j*2+1){//选出左右节点中较大的节点if (j+1<len && nums[j] < nums[j+1]) {j++;}//再将较大值与根节点相比较if (nums[j] > temp) {nums[i] = nums[j];//更新ii = j;}else{break;}}nums[i] = temp;//将temp放到最终位置}public static void main(String[] args) {int[] nums = {1,2,3,4,5,6,7};Main main = new Main();main.heapSort(nums);System.out.println(Arrays.toString(nums));}
}
-归并排序```javapublic void mergeSort(int[] nums){int[] p = Arrays.copyOf(nums,nums.length);mergeSort(nums,0,nums.length-1,p);}private void mergeSort(int[] nums, int left, int right,int[] p) {if(left==right) return; //1个元素时总是有序的int mid = left + (right - left) / 2;mergeSort(nums, left, mid,p); //使左半部分有序 前闭后开mergeSort(nums, mid + 1, right,p); //使右半部分有序if(nums[mid]<=nums[mid+1]) return; //若整个数组已经有序,则不需要合并merge(nums, left, mid, right,p);//跨越两个区间有序}private void merge(int[] nums, int left, int mid, int right,int[] p) {//拷贝数组for(int i=left;i<=right;i++){p[i] = nums[i];}//左右数组的起点int i = left;int j = mid+1;//插入排序for(int k=left;k<=right;k++){//只有左边数组if(j==right+1){nums[k] = p[i++];}else if(i==mid+1){nums[k] = p[j++];}else{if(p[i]>p[j]){nums[k] = p[j++];}else{nums[k] = p[i++];}}}}
快速排序
/*** 快速排序* @param nums*/public void quickSort(int[] nums){quickSort(nums,0,nums.length-1);}private void quickSort(int[] nums, int left, int right) {if(left>=right) return;int index = selectIndex(nums,left,right);quickSort(nums,left,index-1);quickSort(nums, index+1, right);}private int selectIndex(int[] nums, int left, int right) {int temp = nums[left];while(left<right){while(left<right&&nums[right]>=temp){right--;}nums[left] = nums[right];while(left<right&&nums[left]<=temp){left++;}nums[right] = nums[left];}nums[left] = temp;//一定要还原回去,不能破坏原数组的数据return left;}
