题解32 | 经典冒泡+快速+归并#排序#

排序

https://www.nowcoder.com/practice/2baf799ea0594abd974d37139de27896

1.冒泡排序

时间复杂度为O(n^2),空间复杂度为O(1)。

基本算法思想比较相邻的两个元素,如果顺序错误就交换位置,直到整个数组有序。

#include <algorithm>
#include <fstream>
#include <vector>
class Solution {
public:
    /*
     * @param arr int整型vector 待排序的数组
     * @return int整型vector
     */
    //经典冒泡排序
    void bubbleSort(vector<int>& arr){
        int i,j,temp;
        for(i = 1; i < arr.size(); i++){
            for (j = 0; j < i; j++) {
                if (arr[i] < arr[j]) {
                    swap(arr[i],arr[j]);
                }  
            }//for in
        }//for out
    }
   //最终汇总实现
    vector<int> MySort(vector<int>& arr) {
        // write code here
        // bubbleSort(arr);
        // quickSort(arr, 0, arr.size() - 1);
        int left = 0;
        int right = arr.size() - 1;
        vector<int> tmp = arr;
        mergeSort(arr, left, right, tmp);
        return arr;
    }
};

2.快速排序

时间复杂度为O(nlogn),空间复杂度为O(logn)。

基本算法思想选择一个基准元素,将数组分为两部分,一部分小于基准元素,一部分大于基准元素,然后对两部分进行递归排序。

//快速排序

 void quickSort(vector<int> &array, int start, int end) {
        if(start < end){
            int key = array[start];
            int i = start;
            int j = start + 1;

            for( ; j <= end; j++){
                if (key > array[j]) {
                    //先进行自增 一个一个往前塞
                    i++;
                    swap(array[i],array[j]);
                }
            }
            //把比key小(大)的极值放到start,然后再把中枢放到指定位置【i】
            array[start] = array[i];
            array[i] = key;
            //递归处理左右剩余部分
            quickSort(array, start, i - 1);
            quickSort(array, i + 1, end);
        } 
    }

3.归并排序

时间复杂度为O(nlogn),空间复杂度为O(n)。

基本算法思想是将数组不断划分为两个子数组,然后将两个子数组合并成一个有序数组。

//归并排序

 void mergeSort(vector<int> &arr, int left, int right, vector<int> tmp){
       if(left == right)//特殊情况
            return ;
    	//确定中间值
       int mid = (left + right) / 2;

       mergeSort(arr, left, mid, tmp);//左部分到mid
       mergeSort(arr, mid+1, right, tmp);//右部分从mid+1开始

       merge(arr,left,mid,right,tmp);

    }
 void merge(vector<int> &arr, int left, int mid, int right, vector<int> tmp) {
       int i = 0;
       int l = left;//左半数组的下标  
       int m = mid+1;//右半数组的下标
		//先合并存到辅助数组
       while (l <= mid && m <= right) {
            tmp[i++] = arr[l]<arr[m]? arr[l++]:arr[m++];
       }
       while (l <= mid ) {
            tmp[i++] = arr[l++];
       }
       while (m <= right) {
            tmp[i++] = arr[m++];
       }
		//辅助数组再重新复制给原来的arr数组返回
       for(int j = left; j <= right; j++){
            arr[j] = tmp[j];
       }
    }

2024考研数据结构 文章被收录于专栏

本人考研刷算法题,立此专栏练习强化。

全部评论

相关推荐

评论
1
收藏
分享
牛客网
牛客企业服务