`
xlover
  • 浏览: 245018 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

算法分析之快速排序

 
阅读更多
一.快速排序基本特性


平均时间复杂度:O(n*lgn)
最坏时间复杂度:O(n^2)
空间复杂度:O(n*lgn)
不稳定




二.快速排序描诉

快速排序是基于分治思想的一种排序算法。
对于一个典型的数组A[n]的排序思路是:

1.分解
把数组分为A[0~k-1]和A[k+1~n]使得前一半数据小于A[K],后一半数据大于A[K]

2.递归
递归调用快速排序对两半数组进行快速排序。

3.合并

如果只说分治思想不好理解,我们还可以说是一种挖坑+分治的思想。在排序过程中不断挖坑
,然后填补!

例子:
原始数据:{2,8,7,1,3,5,6,4}

第一步以数组第一个元素为分割点,在此处为:2
i游标从前往后走找比标准值大的,j游标从后往前走找比标准值小的

找比2小的数据,用j游标从后往前找,直到j指向1时,找到符合条件的数据。

OK!我们挖坑,把2挖掉,用1填坑,自然1所在的位置被挖坑。

现在数据变成了{ 1,8,7, ,3,5,6,4}
i=0;j=3

第二步
改用i游标从前往后找比2大的数,知道i指向8  OK!
把8填到刚挖的坑上。
现在数据变成了{1, ,7,8,3,5,6,4}
i=1;j=3

由于i<j继续
继续用J游标从后往前找比2小的数,直到j=i时。
完成了一趟快速排序。

把2填回。
数据变为:{1,2,7,8,3,5,6,4}

OK我们完成了一趟快速排序。

这是网上找的一个这个版本的快速排序:
思想是一样的
/**************************************************/
/*  函数功能:快速排序算法                        */
/*  函数参数:结构类型table的指针变量tab          */
/*            整型变量left和right左右边界的下标   */
/*  函数返回值:空                                */
/*  文件名:quicsort.c  函数名:quicksort ()      */
/**************************************************/
void quicksort(table *tab,int left,int right)
{
  int i,j;
  if(left<right)
  {
    i=left;j=right;
    tab->r[0]=tab->r[i]; //准备以本次最左边的元素值为标准进行划分,先保存其值
    do
    {
      while(tab->r[j].key>tab->r[0].key&&i<j)
        j--;        //从右向左找第1个小于标准值的位置j
      if(i<j)                               //找到了,位置为j
      {
        tab->r[i].key=tab->r[j].key;i++;
      }           //将第j个元素置于左端并重置i
      while(tab->r[i].key<tab->r[0].key&&i<j)
        i++;      //从左向右找第1个大于标准值的位置i
      if(i<j)                       //找到了,位置为i
      {
        tab->r[j].key=tab->r[i].key;j--;
      }           //将第i个元素置于右端并重置j
    }while(i!=j);

    tab->r[i]=tab->r[0];         //将标准值放入它的最终位置,本次划分结束
    quicksort(tab,left,i-1);     //对标准值左半部递归调用本函数
    quicksort(tab,i+1,right);    //对标准值右半部递归调用本函数
  }
}









分享到:
评论

相关推荐

    算法设计分析中 快速排序

    算法设计分析课本中,根据快速排序算法而得来的程序。希望对大家有用~~

    算法设计与分析-1排序算法性能分析-冒泡/选择/插入/合并/快速排序-pre ppt

    本篇文章将详细讨论几种常见的排序算法:选择排序、冒泡排序、插入排序、合并排序以及快速排序,分析它们的算法原理、时间效率,并通过经验分析验证理论分析的准确性。 **1. 选择排序(Selection Sort)** 选择排序...

    算法分析与设计快速排序

    但这种情况在实际应用中很少出现,快速排序通常被认为是实际应用中最快的通用排序算法之一。 快速排序的空间复杂度主要取决于递归调用的深度,对于平衡的划分,空间复杂度接近O(log n)。而在最坏的情况下,如果每次...

    算法分析 2.3快速排序 分治法

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出,它基于分治法的思想。分治法是解决复杂问题的一种策略,它将一个大问题分解为若干个规模较小的同类问题,然后分别解决这些小问题,最后...

    随机快速排序 算法设计与分析实验报告

    快速排序算法的基本思想是:随机选取数组中的一个值,将所要进行排序的数分为左右两个部分,其中一部分的所有数据都比另外一部分的数据小,然后将所分得的两部分数据进行同样的划分,重复执行以上的划分操作,直到...

    舍伍德——快速排序源码报告和算法分析

    舍伍德在这个主题上进行的研究可能包括对快速排序算法的优化和性能分析。 快速排序的基本思想是选取一个基准元素,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要...

    算法设计实验报告-快速排序和归并排序

    本实验旨在通过对两种经典排序算法——快速排序和归并排序的研究与实现,深入理解它们的基本原理、时间复杂度,并通过编程实践比较这两种算法在不同数据规模下的性能表现。 #### 二、快速排序 **1. 基本思想** ...

    算法设计与分析快速排序算法

    算法的学习,分治

    《算法设计与分析》实验报告---快速排序.pdf

    快速排序算法设计与分析 快速排序(Quicksort)是一种高效的排序算法,由美国计算机科学家Tony Hoare在1960年发明。该算法的时间复杂度平均为O(n log n),在实际应用中非常常用。 一、快速排序算法的基本思想 ...

    快速排序算法matlab

    通过上述案例分析和MATLAB实现,我们不仅了解了快速排序的基本原理和步骤,还掌握了如何在MATLAB中实现快速排序算法。快速排序作为一种高效且实用的排序方法,在各种场景下都有着广泛的应用价值。对于从事生物医学...

    c语言快速排序算法(算法设计与分析第2版)王晓东

    快速排序 实验数据:input.txt(共100个数据) ——要求按从小到大进行排序 将排好序的数据输出到output.txt文件中

    快速排序算法以及归并算法

    根据给定的文件信息,我们将深入探讨两种经典的排序算法——快速排序和归并排序,并结合Java语言实现进行详细解析。 ### 快速排序算法 快速排序是一种高效的排序算法,采用分而治之的策略,其核心思想是选择一个...

    算法分析与设计 排序算法比较

    算法分析与设计排序算法比较 通过对各种排序算法的思想、算法的分析,探究它的使用范围以及时间复杂度和空间复杂度。 冒泡排序算法 冒泡排序算法思想简单描述:在要排序的一组数中,对当前还未排好序的范围内的...

    快速排序的改进算法

    ### 快速排序的改进算法 #### 一、引言 快速排序是由C.A.R. Hoare于1962年提出的一种高效的排序算法。它以其优秀的平均性能和较小的常数因子,在实际应用中非常受欢迎。然而,在最坏情况下,快速排序的时间复杂度...

    快速排序与归并排序的算法比较实验报告

    **快速排序与归并排序算法比较实验报告** 在计算机科学中,排序算法是处理大量数据时不可或缺的一部分。这篇实验报告将深入探讨两种经典的排序算法——快速排序和归并排序,通过对它们在Java环境中的实现和性能测试...

    二分搜索算法、快速排序,算法分析与设计(完整的代码,结合例题详细解析) 全套资源,求抱走!!!

    随机化快速排序的实现会在原有的快速排序代码基础上修改基准的选择,用随机数生成器选择数组内的一个随机位置作为基准,从而避免最坏情况的发生,确保算法的平均时间复杂度接近于O(nlogn)。 通过这次实验,我们可以...

    matlab 快速排序和归并排序算法

    快速排序和归并排序是两种常用的排序算法,它们在计算机科学和编程领域有着广泛的应用,尤其是在数据处理和分析中。MATLAB作为一种强大的数值计算和数据分析工具,提供了丰富的函数和工具来实现这些算法。 快速排序...

    算法实验1-快速排序

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法(Divide and Conquer),将一个大问题分解为小问题来解决。快速排序的主要步骤包括选择一个基准元素、划分数组...

Global site tag (gtag.js) - Google Analytics