排序算法 - 图1
排序算法 - 图2

选择排序

  1. class Solution {
  2. public:
  3. vector<int> sortArray(vector<int>& nums) {
  4. int len = nums.size();
  5. for(int i=0;i<len-1;i++){
  6. int k = i;
  7. for(int j=i+1;j<len;j++){
  8. if(nums[j]<nums[k]){
  9. k = j;
  10. }
  11. }
  12. if(k!=i){
  13. swap(nums[i],nums[k]);
  14. }
  15. }
  16. return nums;
  17. }
  18. };

冒泡排序

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        int len = nums.size();
        for(int i=0;i<len-1;i++){
            for(int j=0;j<len-i-1;j++){
                if(nums[j]>nums[j+1]){
                    swap(nums[j],nums[j+1]);
                }
            }
        }
        return nums;
    }
};
  • 时间复杂度 O(n^2)
  • 空间复杂度 O(1)

    快速排序

    class Solution {
    public:
      vector<int> sortArray(vector<int>& nums) {
          q_sort(nums,0,nums.size()-1);
          return nums;
      }
      void q_sort(vector<int>& nums,int low, int high){
          if(low<high){
              int part = partation(nums,low,high);
              q_sort(nums,low,part-1);
              q_sort(nums,part+1,high);
          }
      }
      int partation(vector<int>&nums, int low,int high){
          int pivot = nums[low];
          int i=low,j=high;
          while(i<j){
              while(i<j&&nums[j]>=pivot) j--;
              nums[i] = nums[j];
              while(i<j&&nums[i]<=pivot) i++;
              nums[j] = nums[i];
          }
          nums[i] = pivot;
          return i;
      }
    };
    
  • 时间复杂度 O(n^2)

  • 空间复杂度 O(1)

    堆排序

    堆排序的思想就是先将待排序的序列建成大根堆,使得每个父节点的元素大于等于它的子节点。此时整个序列最大值即为堆顶元素,我们将其与末尾元素交换,使末尾元素为最大值,然后再调整堆顶元素使得剩下的 n-1 个元素仍为大根堆,再重复执行以上操作我们即能得到一个有序的序列。

如下两个动图展示了对 [4, 6, 8, 5, 9] 这个数组堆排序的过程:
排序算法 - 图3
排序算法 - 图4

class Solution {
    void maxHeapify(vector<int>& nums, int i, int len) {
        for (; (i << 1) + 1 <= len;) {
            int lson = (i << 1) + 1;
            int rson = (i << 1) + 2;
            int large;
            if (lson <= len && nums[lson] > nums[i]) {
                large = lson;
            } else {
                large = i;
            }
            if (rson <= len && nums[rson] > nums[large]) {
                large = rson;
            }
            if (large != i) {
                swap(nums[i], nums[large]);
                i = large;
            } else {
                break;
            }
        }
    }
    void buildMaxHeap(vector<int>& nums, int len) {
        for (int i = len / 2; i >= 0; --i) {
            maxHeapify(nums, i, len);
        }
    }
    void heapSort(vector<int>& nums) {
        int len = (int)nums.size() - 1;
        buildMaxHeap(nums, len);
        for (int i = len; i >= 1; --i) {
            swap(nums[i], nums[0]);
            len -= 1;
            maxHeapify(nums, 0, len);
        }
    }
public:
    vector<int> sortArray(vector<int>& nums) {
        heapSort(nums);
        return nums;
    }
};

归并排序

排序算法 - 图5

class Solution {
    vector<int> tmp;
    void mergeSort(vector<int>& nums, int l, int r) {
        if (l >= r) return;
        int mid = (l + r) >> 1;
        mergeSort(nums, l, mid);
        mergeSort(nums, mid + 1, r);
        int i = l, j = mid + 1;
        int cnt = 0;
        while (i <= mid && j <= r) {
            if (nums[i] <= nums[j]) {
                tmp[cnt++] = nums[i++];
            }
            else {
                tmp[cnt++] = nums[j++];
            }
        }
        while (i <= mid) {
            tmp[cnt++] = nums[i++];
        }
        while (j <= r) {
            tmp[cnt++] = nums[j++];
        }
        for (int i = 0; i < r - l + 1; ++i) {
            nums[i + l] = tmp[i];
        }
    }
public:
    vector<int> sortArray(vector<int>& nums) {
        tmp.resize((int)nums.size(), 0);
        mergeSort(nums, 0, (int)nums.size() - 1);
        return nums;
    }
};