C++学习之第十一天之快速排序

//给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

示例 1:
输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]
    
示例 2:
输入:nums = [2,0,1]
输出:[0,1,2]
    
示例 3:
输入:nums = [0]
输出:[0]
    
示例 4:
输入:nums = [1]
输出:[1]

快速排序之如何分割?

快速排序分割结果:数组左边的值都小于分割点,右边的值大于分割点的值。
1.拿最右边作为分割点,遍历列表,拿列表里的每个元素与分割点进行比较;
2.设计游标k指向列表最左边,如果当前值小于分割点,就将当前位置值与游标k对应元素进行交换,k进行加1操作,用k来记录的小于分割点元素的个数。
3.列表遍历完毕,交换k指向的元素与分割点的元素,return k

/*
快速排序:
1.拿最右边作为分割点,列表里的每个元素与分割点进行比较,
2.设计游标k指向列表最左边,如果小于分割点,就将当前位置值与游标k对应元素进行交换,k进行加1操作,
3.列表遍历完毕,交换k指向的元素与分割点,return k
*/
#include <iostream>
#include <vector>
using namespace std;
class Solution
{
public:
    int partition(vector<int>&num,int left,int right)//right为数组最后一个下标
    {
        int k = left;//1.设置游标指向最左边
        int temp;
        for(int i = left;i<right;i++)//2.最右边作为分割点,因此遍历不到
        {
            if(num[i]<num[right])//3.当前遍历到的结点小于分割点,互换且k+1;否则继续遍历
            {
                temp = num[i];
                num[i] = num[k];
                num[k] = temp;
                k++;
            }
        }

        temp = num[k];//k指向的值与分割点交换,此时k指针的左边全是小于num[k]的数,右边全大于num[k]
        num[k]=num[right];
        num[right]=temp;

        return k;//返回分割点下标
    }

    void QuickSort(vector<int>&num,int left,int right)
    {
        if(left<right)
        {
            int pivot = partition(num, left,right);
            QuickSort(num,left,pivot-1);
            QuickSort(num,pivot+1,right);
        }
    }
    void colorSort(vector<int>&num)
    {
        QuickSort(num,0,num.size()-1);
    }
};
void PrintArray(vector<int>&num1) //打印数组                                                            
{

    for(vector<int>::iterator it=num1.begin();it!=num1.end();it++)
    {
        cout<<*it<<" ";
    }
    cout<<endl;
}

void test01()
{
    vector<int> num = {2,0,2,1,1,0};
    vector<int> num1 = {2,0,1};
    vector<int> num2 = {0};
    vector<int> num3 = {1};
    Solution s1;
    s1.colorSort(num);
    PrintArray(num);
    s1.colorSort(num1);
    PrintArray(num1);
    s1.colorSort(num2);
    PrintArray(num2);
    s1.colorSort(num3);
    PrintArray(num3);

}
int main()
{
    test01();
    return 0;
}

运行结果

0 0 1 1 2 2 
0 1 2 

1

猜你喜欢

转载自blog.csdn.net/weixin_49278191/article/details/121229643