IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++快速排序和归并排序思路+实现 -> 正文阅读

[C++知识库]C++快速排序和归并排序思路+实现

1、快速排序:O(NlogN),不稳定。

基本思路:
1.1、设置两个变量 left、right。
1.2、整个数组找基准正确位置,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面。

在数据随机情况下,默认数组的第一个数为基准数据,赋值给key,即key = array[left]。

  • 因为默认数组的第一个数为基准,所以从后面开始向前搜索(right),找到第一个小于key的array[right],(循环条件是array[right] >= key;结束时 array[right] < key)。
  • 此时从前面开始向后搜索(left++),找到第一个大于key的array[left](循环条件是 array[left] <= key;结束时array[left] > key)。

找到第一对i ,j,然后swap。

循环 1-3 步骤,直到 left >= right,该位置就是基准位置。把基准数据赋给当前位置。
1.3、第一趟找到的基准位置,作为下一趟的分界点。
1.4、递归调用分界点前和分界点后的子数组排序,重复1.2、1.3、1.4的步骤。

写法1
void QuickSort(vector<int>& nums, int l, int r)
{
	if(nums.size() == 0)return;
	if(l >= r)return;
	int i = l, j = r;
	while(i < j)
	{
		while(i < j && nums[j] >= nums[l]) j--;
		while(i < j && nums[i] <= nums[l]) i++;
		swap(nums[i], nums[j]);
	}
	swap(nums[i], nums[l]);
	QuickSort(nums, l, i - 1);
	QuickSort(nums, i + 1, r);
}
写法2
int partition(vector<int>&arr, int l, int r)
{
	if(arr.size() == 0 || l < 0 || r< 0)return -1;
	int key = arr[l];
		int i = l, j = r;
        while (i < j) {
            while (i < j && arr[j] >= key) j--;
            while (i < j && arr[i] <= key) i++;
            swap(arr[i], arr[j]);
        }
        swap(arr[i], key);
        return i;
}
void Quicksort(vector<int>& arr, int l,int r)
{
	  if (l >= r) return;
	  int i = partition(arr, l ,r);
	  Quicksort(arr, l, i - 1);
      Quicksort(arr, i + 1, r);
}

2、归并排序:O(N*logN) /O(N) 稳定

从局部有序到整体有序。具体来说,就是可以将原数组进行分割(分治),分别进行运算(递归),实现局部有序,然后通过一个外排进而实现整体有序

分治到只有一个数字,两两比较,借助辅助数组,a和b中的较小值填入辅助数组,并且右移,直到其中一个指针遍历了其所在的子数组的全部元素,结束并将另外的数组的剩余元素全部拷贝到辅助数组。

#include<iostream>
#include<vector>
using namespace std;

void mergeSort(vector<int>& nums, int l, int mid, int r) {
    vector<int>tmp(r - l + 1, 0);
    int i = l;   //左边第一个
    int j = mid + 1;//右边第一个
    int index = 0;
    while (i <= mid && j <= r) {
        if (nums[i] <= nums[j]) {
            tmp[index++] = nums[i++];
        }
        else {
            tmp[index++] = nums[j++];
        }
    }
    //把左边剩余的数移入数组
    while (i <= mid) {
        tmp[index++] = nums[i++];
    }
    //把右边剩余的数移入数组
    while (j <= r) {
        tmp[index++] = nums[j++];
    }
    //把新数组中的数覆盖nums数组
    for (int k = 0; k < tmp.size(); k++) {
        nums[k + l] = tmp[k];
    }
}
void merge(vector<int>& nums, int l, int r) {
    if (l >= r)return;
    int mid = l + ((r - l) >> 1);
    merge(nums, l, mid);
    merge(nums, mid + 1, r);
    mergeSort(nums, l, mid, r);
}

int main()
{
    vector<int>nums = {7,3,2,6,0,1,5,4};
    int n = nums.size();
    merge(nums, 0, n - 1);
    for (int i = 0; i < n; i++)
    {
        cout << nums[i] << " ,";
    }
    return 0;
}

稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 仍然在 b 的前面,则为稳定排序。
冒泡+插入+归并稳定。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-03 10:58:44  更:2021-08-03 10:59:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 0:18:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码