排序算法

  • 冒泡排序
    1. /**
    2. * 冒泡排序
    3. * @param num
    4. */
    5. public void bubbleSort(int[] num){
    6. for (int i = 0; i < num.length; i++) {
    7. for (int j = 0; j < num.length-i-1; j++) {
    8. if(num[j]>num[j+1]){
    9. int temp = num[j];
    10. num[j] = num[j+1];
    11. num[j+1] = temp;
    12. }
    13. }
    14. }
    15. }
  • 选择排序
    1. /**
    2. * 选择排序
    3. * @param nums
    4. */
    5. public void selectSort(int[] nums){
    6. for (int i = 0; i < nums.length; i++) {
    7. int minIndex = i;
    8. for (int j = i; j < nums.length; j++) {
    9. if(nums[j]<nums[minIndex]){
    10. minIndex = j; //更新最小值的下标
    11. }
    12. }
    13. //将当前元素与目前最小值交换
    14. int temp = nums[minIndex];
    15. nums[minIndex] = nums[i];
    16. nums[i] = temp;
    17. }
    18. }
  • 插入排序
    1. /**
    2. * 直接插入排序
    3. * @param nums
    4. */
    5. public void insertSort(int[] nums){
    6. int n = nums.length;
    7. for(int i=1;i<n;i++){
    8. //待排序元素小于有序序列的最后一个元素时,向前插入
    9. if(nums[i]<nums[i-1]){
    10. int temp = nums[i]; //待排序元素
    11. for(int j=i;j>=0;j--){
    12. if(j>0&&nums[j-1]>temp){
    13. nums[j] = nums[j-1]; //元素后移
    14. }else{
    15. nums[j] = temp; //放在合适的位置
    16. break;
    17. }
    18. }
    19. }
    20. }
    21. }
  • 希尔排序
    1. /**
    2. * 希尔排序
    3. * @param nums
    4. */
    5. public void shellSort(int[] nums){
    6. int len = nums.length;
    7. int d = len/2; //增量
    8. while(d>0) {
    9. //一趟排序
    10. for (int i = d;i<len;i++) {
    11. for (int j = i;j>=d;j-=d) {
    12. if (nums[j] < nums[j-d]) {
    13. int temp = nums[j - d];
    14. nums[j - d] = nums[j];
    15. nums[j] = temp;
    16. }
    17. }
    18. }
    19. d /= 2;//每次增量减半
    20. }
    21. }
  • 堆排序 ```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); } }

  1. //调整堆
  2. public void adjustHeap(int[] nums,int i,int len){
  3. int temp = nums[i];
  4. //沿关键字较大的孩子节点向下筛选
  5. for(int j=i*2+1;j<len;j=j*2+1){
  6. //选出左右节点中较大的节点
  7. if (j+1<len && nums[j] < nums[j+1]) {
  8. j++;
  9. }
  10. //再将较大值与根节点相比较
  11. if (nums[j] > temp) {
  12. nums[i] = nums[j];
  13. //更新i
  14. i = j;
  15. }else{
  16. break;
  17. }
  18. }
  19. nums[i] = temp;//将temp放到最终位置
  20. }
  21. public static void main(String[] args) {
  22. int[] nums = {1,2,3,4,5,6,7};
  23. Main main = new Main();
  24. main.heapSort(nums);
  25. System.out.println(Arrays.toString(nums));
  26. }

}

  1. -
  2. 归并排序
  3. ```java
  4. public void mergeSort(int[] nums){
  5. int[] p = Arrays.copyOf(nums,nums.length);
  6. mergeSort(nums,0,nums.length-1,p);
  7. }
  8. private void mergeSort(int[] nums, int left, int right,int[] p) {
  9. if(left==right) return; //1个元素时总是有序的
  10. int mid = left + (right - left) / 2;
  11. mergeSort(nums, left, mid,p); //使左半部分有序 前闭后开
  12. mergeSort(nums, mid + 1, right,p); //使右半部分有序
  13. if(nums[mid]<=nums[mid+1]) return; //若整个数组已经有序,则不需要合并
  14. merge(nums, left, mid, right,p);//跨越两个区间有序
  15. }
  16. private void merge(int[] nums, int left, int mid, int right,int[] p) {
  17. //拷贝数组
  18. for(int i=left;i<=right;i++){
  19. p[i] = nums[i];
  20. }
  21. //左右数组的起点
  22. int i = left;
  23. int j = mid+1;
  24. //插入排序
  25. for(int k=left;k<=right;k++){
  26. //只有左边数组
  27. if(j==right+1){
  28. nums[k] = p[i++];
  29. }else if(i==mid+1){
  30. nums[k] = p[j++];
  31. }else{
  32. if(p[i]>p[j]){
  33. nums[k] = p[j++];
  34. }else{
  35. nums[k] = p[i++];
  36. }
  37. }
  38. }
  39. }
  • 快速排序

    1. /**
    2. * 快速排序
    3. * @param nums
    4. */
    5. public void quickSort(int[] nums){
    6. quickSort(nums,0,nums.length-1);
    7. }
    8. private void quickSort(int[] nums, int left, int right) {
    9. if(left>=right) return;
    10. int index = selectIndex(nums,left,right);
    11. quickSort(nums,left,index-1);
    12. quickSort(nums, index+1, right);
    13. }
    14. private int selectIndex(int[] nums, int left, int right) {
    15. int temp = nums[left];
    16. while(left<right){
    17. while(left<right&&nums[right]>=temp){
    18. right--;
    19. }
    20. nums[left] = nums[right];
    21. while(left<right&&nums[left]<=temp){
    22. left++;
    23. }
    24. nums[right] = nums[left];
    25. }
    26. nums[left] = temp;//一定要还原回去,不能破坏原数组的数据
    27. return left;
    28. }