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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构-快速排序 -> 正文阅读

[数据结构与算法]数据结构-快速排序

时间复杂度:O(nlgn)

不需要额外开辟空间,在原数组的基础上进行排序。

一般用数组中的第一个元素作为标定元素。将标定的元素放大合适的位置中。如下图,左边绿色部分都是小于4的,右侧橙色部分都是大于4的。

?定义两个区间:arr[1+l...j] <4? arr[j+1...i-1]>4,用区间内的数与4比较再别存入其中。从第二个元素开始比较,因此定义i指向第二个元素,j指向l

?初始化时应该保证数组为空。

开始比较,5>4,i++

?再次比较,1<4,j++

交换位置,i++

此时,arr[1+l..j]=arr[1~1] = 1,1纳入了小于4的区间

同理,比较3<4,j++,交换,i++

?6同样如此,

比较2时,2<4,先j++,再交换

再交换位置?

?

?i++

?完成排序

?代码实现:

class QuickSort1
    {
        public static void Sort(int[] arr)
        {
            int n = arr.Length;
            Sort(arr, 0, n - 1);
        }

        private static void Sort(int[] arr,int l,int r)
        {
            //对小规模的数组使用插入排序,避免频繁的递归调用
            if (r - l + 1 <= 15)
            {
                InsertSort.Sort1(arr, l, r);
                return;
            }

            int v = arr[l]; //标定元素v

            int j = l; // arr[l+1...j] < v  arr[j+1...i-1] > v

            //往对应区间填充元素
            for (int i = l+1; i <= r; i++)
            {
                if(arr[i] < v)
                {
                    j++;
                    Swap(arr, i, j);
                }
            }

            //将标定元素放到合适的位置
            Swap(arr, l, j);

            Sort(arr, l, j - 1);  //将左半边arr[l...j-1]排序
            Sort(arr, j + 1, r);  //将右半边arr[j+1...r]排序
        }

        private static void Swap(int[] arr,int i,int j)
        {
            int e = arr[i];
            arr[i] = arr[j];
            arr[j] = e;
        }

快排的局限性:快排有序数组时时间复杂度O(n2)

?改良快排:随机化快速排序

创建一个Random对象:

?//在[l...r]的范围随机一个位置

? int p =l + rd.Next(r - l + 1);??

?将随机的位置与l进行交换使它作为被选择的元素。

//和第一个元素交换作为标定元素,这一步对有序性很强的数组排序有很好的优化。
?Swap(arr, l, p);

?

//随机化的快速排序 O(nlogn)
? ? class QuickSort2
? ? {
? ? ? ? //随机类全局变量,不能写在方法内作为局部变量。
? ? ? ? private static Random rd = new Random();

? ? ? ? public static void Sort(int[] arr)
? ? ? ? {
? ? ? ? ? ? int n = arr.Length;
? ? ? ? ? ? Sort(arr, 0, n - 1);
? ? ? ? }

? ? ? ? private static void Sort(int[] arr, int l, int r)
? ? ? ? {
? ? ? ? ? ? if (r - l + 1 <= 15)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? InsertSort.Sort1(arr, l, r);
? ? ? ? ? ? ? ? return;
? ? ? ? ? ? }

? ? ? ? ? ? //在[l...r]的范围随机一个位置
? ? ? ? ? ? int p =l + rd.Next(r - l + 1);

? ? ? ? ? ? //和第一个元素交换作为标定元素,这一步对有序性很强的数组排序有很好的优化。
? ? ? ? ? ? Swap(arr, l, p);

? ? ? ? ? ? int v = arr[l];

? ? ? ? ? ? int j = l; // arr[l+1...j] < v ?arr[j+1...i-1] > v

? ? ? ? ? ? for (int i = l + 1; i <= r; i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if (arr[i] < v)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? j++;
? ? ? ? ? ? ? ? ? ? Swap(arr, i, j);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }

? ? ? ? ? ? Swap(arr, l, j);
? ? ? ? ? ? Sort(arr, l, j - 1);
? ? ? ? ? ? Sort(arr, j + 1, r);
? ? ? ? }

? ? ? ? private static void Swap(int[] arr, int i, int j)
? ? ? ? {
? ? ? ? ? ? int e = arr[i];
? ? ? ? ? ? arr[i] = arr[j];
? ? ? ? ? ? arr[j] = e;
? ? ? ? }
? ? }

?

?

?

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 01:12:58  更:2022-09-30 01:16:02 
 
开发: 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/19 18:45:23-

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