冒泡 选择 快排

学习:

冒泡、选择图解看这个链接
<注意:!!里面程序是不对的,但是冒泡和选择的算法可视化做的很清楚>
快排算法基本思想
<主要包含两种:挖坑和双指针>
大佬写得快排C++实现

根据题目写几种排序算法:
lc
在这里插入图片描述

选择排序:

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int j =m;
        for(int i = 0 ;i<n ; i++  ){
            nums1[j] = nums2[i];
            j++;
        }
        for (int p =0 ;p< nums1.size() ; p++){
            for(int q = p+1 ; q < nums1.size() ; q++){
                int temp;
                if(nums1[p] > nums1[q]){
                    temp = nums1[p];
                    nums1[p] = nums1[q];
                    nums1[q] = temp;
                }
            }
        }

    }
};

在这里插入图片描述

选择排序这样写并不好,原因在于:遇到一个满足条件的就去交换一次,其实浪费了很多时间在“不必要的交换”上。按照下面的写法重新写:

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int j =m;
        for(int i = 0 ;i<n ; i++  ){
            nums1[j] = nums2[i];
            j++;
        }
        int temp;
        for (int p =0 ;p< nums1.size() ; p++){
            temp = p;
            for(int q = p+1 ; q < nums1.size() ; q++){
                if(nums1[temp] > nums1[q]){
                    temp = q;
                }
            }
            swap(nums1[p],nums1[temp]);
        }

    }
};

在这里插入图片描述
啊,尴尬的事情出现了,好像内存、时间都没什么变化,看来差别不大。

冒泡排序法:

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int j =m;
        for(int i = 0 ;i<n ; i++  ){
            nums1[j] = nums2[i];
            j++;
        }

        //这里
        int temp;
        for (int cunt = nums1.size()-1 ; cunt > 0; cunt-- ){
            for(int p = 0  ; p < cunt ;p++  ){
                if(nums1[p] > nums1[p+1]){
                    temp = nums1[p+1];
                    nums1[p+1] = nums1[p];
                    nums1[p] = temp;
                }
            }
        }
    }
};

在这里插入图片描述
写冒泡的时候我zz了,写成了:

  int temp;
	        for (int cunt = nums1.size()-1 ; cunt > 0; cunt-- ){
	            for(int p = 0 ,q = p+1 ; p < cunt ;p++  ){
	                if(nums1[p] > nums1[q]){
	                    temp = nums1[q];
	                    nums1[q] = nums1[p];
	                    nums1[p] = temp;
	                }
	            }
	        }

这里q并没有跟着p一直++,这么简单的算法错误不该犯。

快速排序法:

class Solution {
public:
	void quickSort(int left, int right, vector<int>& arr)
	{
		if(left >= right)
			return;
		int i, j, base;
		i = left, j = right;
		base = arr[left]; 
		while (i < j)
		{
			while (arr[j] >= base && i < j)
				j--;
			while (arr[i] <= base && i < j)
				i++;
			if(i < j)
			{
				swap(arr[i] , arr[j]);
			}
		}
		swap(arr[left], arr[i]);
		quickSort(left, i - 1, arr);
		quickSort(i + 1, right, arr);
	}
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int j =m;
        for(int i = 0 ;i<n ; i++  ){
            nums1[j] = nums2[i];
            j++;
        }
        quickSort(0,nums1.size()-1 ,nums1);
    }
};

在这里插入图片描述
自己写得时候:

	swap(base, arr[i]);//这里写成base之后运行结果不对,还没有搞清楚原因
	quickSort(left, i - 1, arr);
	quickSort(i + 1, right, arr);
	//啊,我好像知道了,base 只是一个int,用一个数去换数组里面的某一个元素,所以出问题????

其它:

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int j =m;
        for(int i = 0 ;i<n ; i++  ){
            nums1[j] = nums2[i];
            j++;
        }

     sort(nums1.begin(), nums1.end());
    }
};

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值