912. 排序数组

(1)堆排序

image.png

  1. class Solution {
  2. public int[] sortArray(int[] nums) {
  3. headSort(nums,nums.length);
  4. for (int num : nums) {
  5. System.out.println(num);
  6. }
  7. return null;
  8. }
  9. private void headSort(int[]arr,int n){
  10. //建堆
  11. for(int i=n/2-1;i>=0;i--){
  12. heapify(arr,n,i);
  13. }
  14. //排序
  15. for(int i=n-1;i>0;i--){
  16. //交换堆顶元素和数组最后一个元素
  17. swap(arr,0,i);
  18. //维护堆顶性质
  19. heapify(arr,i,0);
  20. }
  21. }
  22. //先堆化,构建一个大顶堆;n表示数组长度,i表示待维护的节点下标
  23. private void heapify(int[]arr,int n,int i){
  24. int largest=i;
  25. int leftSon=2*i+1;
  26. int rightSon=2*i+2;
  27. if(leftSon<n&&arr[largest]<arr[leftSon]){
  28. largest=leftSon;
  29. }
  30. if(rightSon<n&&arr[largest]<arr[rightSon]){
  31. largest=rightSon;
  32. }
  33. //如果最大的不是下标i了,那就需要交换数组的元素
  34. if(largest!=i){
  35. swap(arr,largest,i);
  36. //交换以后,递归维护子孩子堆的性质
  37. heapify(arr,n,largest);
  38. }
  39. }
  40. //交换数组元素
  41. private void swap(int[]arr,int left,int right){
  42. int temp=arr[left];
  43. arr[left]=arr[right];
  44. arr[right]=temp;
  45. return;
  46. }
  47. }

(2)归并排序

  1. package _12codetop._912sortArray;
  2. //归并排序
  3. class Solution2 {
  4. public int[] sortArray(int[] nums) {
  5. int[]temp=new int[nums.length];
  6. split(nums,0,nums.length-1,temp);
  7. return nums;
  8. }
  9. //先分割
  10. private void split(int[] nums, int left, int right, int[] temp) {
  11. if (left < right) {
  12. int mid = (left + right) / 2;
  13. split(nums, left, mid, temp);
  14. split(nums, mid + 1, right, temp);
  15. merge(nums,left,mid,right,temp);
  16. }
  17. }
  18. //合并
  19. private void merge(int[] nums, int left, int mid, int right, int[] temp) {
  20. int l = left;
  21. int r = mid + 1;
  22. int index = 0;
  23. while (l <= mid && r <= right) {
  24. if (nums[l] >= nums[r]) {
  25. temp[index++] = nums[r++];
  26. } else {
  27. temp[index++] = nums[l++];
  28. }
  29. }
  30. if (r > right) {
  31. while (l <= mid) {
  32. temp[index++] = nums[l++];
  33. }
  34. } else if (l > mid) {
  35. while (r <= right) {
  36. temp[index++] = nums[r++];
  37. }
  38. }
  39. //最后把temp中的元素,复制到nums数组中
  40. int tempLeft = left;
  41. index=0;
  42. while (tempLeft<=right){
  43. nums[tempLeft++]=temp[index++];
  44. }
  45. }
  46. }

(3)快速排序

  1. //快速排序
  2. class Solution3 {
  3. public int[] sortArray(int[] nums) {
  4. quickSort(nums, 0, nums.length - 1);
  5. return nums;
  6. }
  7. private void quickSort(int[] nums, int left, int right) {
  8. if (left < right) {
  9. int mid = partition(nums, left, right);
  10. quickSort(nums, left, mid - 1);
  11. quickSort(nums, mid + 1, right);
  12. }
  13. }
  14. private int partition(int[] nums, int left, int right) {
  15. //以最右节点为基准点
  16. int pivot = nums[right];
  17. int i = left;
  18. //j是一个fast指针,如果扫描到有小于pivot的数,就交换ij
  19. for (int j = left; j < right; j++) {
  20. if (nums[j] < pivot) {
  21. //让i的指针往前移动一格
  22. swap(nums, i++, j);
  23. }
  24. }
  25. //遍历完成以后,需要交换i与right的元素,然后返回i的索引位置
  26. swap(nums, i, right);
  27. return i;
  28. }
  29. private void swap(int[] nums, int left, int right) {
  30. int temp = nums[right];
  31. nums[right] = nums[left];
  32. nums[left] = temp;
  33. return;
  34. }
  35. }