【C#】3.算法温故而知新 - 快速排序

简介:

快速排序相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数放到基准点的右边。这样每次交换的时候就不会像冒泡排序一样只能在相邻的数之间进行交换,交换的距离就大得多了。因此总的比较和交换次数就少了,速度自然就提高了。

当在最坏的情况下,仍可能是相邻的两个数进行交换,因此快速排序的最差时间复杂度和冒泡排序一样,都是O(N²),它的平均时间复杂度为O(N㏒N)。

 

示例图片如下

 

 

 

代码:

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    public class Program
    {
        private static int[] a = new int[10] { 6, 1, 2, 7, 9, 3, 4, 5, 10, 8 };//初始化一个数组,其中有10个数,这里假定是我们输入的数,需要从小到大排序
        public static void Main(string[] args)
        {
            QuickSort(0, a.Length - 1);//最左边数和最右边数的下标
            //输出排序后的结果
            for (int i = 0; i < a.Length; i++)
                Console.Write("  " + a[i]);
        }

        /// <summary>交换方法 </summary>
        /// <param name="left">最左边数的下标</param>
        /// <param name="right">最右边数的下标</param>
        private static void QuickSort(int left, int right)
        {
            int i, j, t, temp;
            if (left > right)//下标交错即返回
                return;
            temp = a[left];//temp中存的就是基准数,假定最左边的数为基准数
            i = left;//左边数的下标
            j = right;//右边数的下标

            while (i != j)//当下标不相等时,直到i=j时停止
            {
                //顺序很重要,要先从右往左找
                while (a[j] >= temp && i < j)//找到大于基准数的数
                    j--;
                //再从从左往右找
                while (a[i] <= temp && i < j)//找到小于基准数的数
                    i++;

                //交换两个数在数组中的位置
                if (i < j)
                {
                    t = a[i];
                    a[i] = a[j];
                    a[j] = t;
                }
            }
            //最终将基准数归位
            a[left] = a[i];
            a[i] = temp;

            QuickSort(left, i - 1);//继续处理左边的,这里是一个递归的过程
            QuickSort(i + 1, right);//继续处理右边的,这里是一个递归的过程
        }

    }
}
复制代码





本文转自叶超Luka博客园博客,原文链接:http://www.cnblogs.com/yc-755909659/p/3988414.html,如需转载请自行联系原作者
目录
相关文章
|
27天前
|
存储 算法 C#
C#二叉搜索树算法
C#二叉搜索树算法
|
2月前
|
搜索推荐 算法 Java
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
该博客文章通过UML类图和Java源码示例,展示了如何使用适配器模式将QuickSort类和BinarySearch类的排序和查找功能适配到DataOperation接口中,实现算法的解耦和复用。
22 1
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
|
2月前
|
算法 搜索推荐
算法设计 (分治法应用实验报告)基于分治法的合并排序、快速排序、最近对问题
这篇文章是关于分治法应用的实验报告,详细介绍了如何利用分治法实现合并排序和快速排序算法,并探讨了使用分治法解决二维平面上的最近对问题的方法,包括伪代码、源代码实现及时间效率分析,并附有运行结果和小结。
|
3月前
|
算法 搜索推荐 编译器
算法高手养成记:Python快速排序的深度优化与实战案例分析
【7月更文挑战第11天】快速排序是编程基础,以O(n log n)时间复杂度和原址排序著称。其核心是“分而治之”,通过选择基准元素分割数组并递归排序两部分。优化包括:选择中位数作基准、尾递归优化、小数组用简单排序。以下是一个考虑优化的Python实现片段,展示了随机基准选择。通过实践和优化,能提升算法技能。**
51 3
|
4月前
|
搜索推荐 算法 Java
Java中的快速排序、归并排序和堆排序是常见的排序算法。
【6月更文挑战第21天】Java中的快速排序、归并排序和堆排序是常见的排序算法。快速排序采用分治,以基准元素划分数组并递归排序;归并排序同样分治,先分割再合并有序子数组;堆排序通过构建堆来排序,保持堆性质并交换堆顶元素。每种算法各有优劣:快排平均高效,最坏O(n²);归并稳定O(n log n)但需额外空间;堆排序O(n log n)且原地排序,但不稳定。
38 3
|
4月前
|
算法 搜索推荐 JavaScript
算法学习:快速排序
算法学习:快速排序
40 1
|
3月前
|
Dart 算法 JavaScript
C#数据结构与算法入门教程,值得收藏学习!
C#数据结构与算法入门教程,值得收藏学习!
|
3月前
|
机器学习/深度学习 算法 搜索推荐
一个开源且全面的C#算法实战教程
一个开源且全面的C#算法实战教程
|
3月前
|
算法 搜索推荐 C#
|
4月前
|
搜索推荐 C语言
【C/排序算法】:快速排序和归并排序的非递归实现
【C/排序算法】:快速排序和归并排序的非递归实现
24 0
下一篇
无影云桌面