【算法学习】快速排序

1.算法思路:

  选择一个基准点,将数组中比基准点小的值移到基准值左边,比基准值大的移到基准值右边。然后递归调用,将基准值左右两边的数组做同样操作,递归结束的条件是数组只有一个元素。

  基准点归位的方法:

    设一头一尾两个指针,右指针向左找比第一个基准值小的数,左指针向右找第一个比基准值大的数,找到后交换,直到左指针==右指针;

2.代码:

  

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)
    {
                   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);
}

  

原文地址:https://www.cnblogs.com/teensSpirit-code-life/p/11741377.html

时间: 2024-09-27 02:51:07

【算法学习】快速排序的相关文章

经典算法学习——快速排序

快速排序应该算是在面试笔试中最常用的算法了,各位面试官都非常喜欢.排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,其中的思想也是用了分治法和递归的思想.示例代码上传到:https://github.com/chenyufeng1991/QuickSort 算法的基本思想是: (1)先从数列中取出一个数作为基准数(常常选第一个数): (2)分区过程,比这个数大的数放到它的右边,小于或等于的数全放到它的左边: (3)再对左右区间重复第二步,直到每个区间只有一个数位置,即左边

排序算法学习之快速排序

快速排序基本思想:选取一个枢轴元素(图简单可选第一个),通过对序列一次遍历(中间涉及到数的交换),将该枢轴放置到序列合适位置,保证其左边数都比它小,右边数都比它大,然后利用递归思想对其左右两个子序列进行同样排序. 快熟排序的基本实现过程:将枢轴元素key备份,序列头尾各设置一个游标--i和j,尾部游标j先移动(如果选择的最后一个元素为枢轴则i先移),直到遇到比key小的元素,将其移到原枢轴处覆盖之,此时j处元素空着了,然后再对i进行移动,直到遇到比key大的元素,将其移到右边下表为j的空白处 v

算法学习之路(2)——快速排序

快速排序的基本思想: 1)对任意给定的序列中元素Rs(关键字为Ks),经过一趟排序后,将原序列分割成两个子序列: 2)前一个子序列中的所有元素的关键字均小于等于Ks , 3)后一个子序列中元素的关键字均大于等于Ks. 4)称元素Rs 为分割元素 5)以后只需对2个子序列分别以同样的算法进行快速排序,直到子序列为空或只有一个元素时得到有序序列. 算法可以用递归来实现. a)  i从左向右找第1个大于等于分割元素的元素. b)  j从右向左找第1个小于或等于分割元素的元素. c)  i<j时,a[i

算法学习——分治算法

这是从网上查到的概念资料,先收来~ 一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其规模有关.问题的规模越小,越容易直接求解,解题所需的计算时间也越少.例如,对于n个

排序算法系列——快速排序

记录学习点滴 快速排序算法是一种很有趣的算法,短小精悍,性能强劲,对于大部分情况都可以胜任,但对极端环境难以应付. 快速排序我理解为:这是一个“以自我为中心的”+“分治法”思想的算法. 分治法不必多说,化繁为简,那就是逐个击破. 那什么是“以自我为中心”?顾名思义,就是每次都一个“我”,每个人都要围绕“我”行事,比“我”小的都去左边站着,比“我”他大的都去右边站着,而且“我”不去关心每一边都有谁,反正你没“我”大或者小就行.一旦“我”落位了妥帖了,“我”就不动了.然后再在左右两边分别产生新“我”

算法学习知识点

 ACMer必备知识(这么多呀,慢慢学了-- 图论 路径问题 0/1边权最短路径 BFS 非负边权最短路径(Dijkstra)   (可以用 Dijkstra解决问题的特征) 负边权最短路径   Bellman-Ford Bellman-Ford的 Yen-氏优化 差分约束系统 Floyd 广义路径问题   传递闭包 极小极大距离 /极大极小距离 Euler Path / Tour 圈套圈算法 混合图的 EulerPath / Tour  Hamilton Path / Tour 特殊图的

Python之路,Day21 - 常用算法学习

Python之路,Day21 - 常用算法学习 本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出.如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题.不同的算法可能用不同的时间.空间或效率来完成同样的任务.一个算法的优劣可以用空间复杂度与时间复杂度来衡量. 一个算

算法学习01:二分查询,选择法、插入法、分治法排序

查询与排序是使用的再频繁不过的两个功能,算法学习系列实现语言为C#. 一般情况下的查询 Int32 Search(Int32[] source, Int32 task) { var index = 0; while (index < source.Length) if (source[index++] == task) return index - 1; //返回值为Length则说明未找到 return source.Length; } 时间复杂度为O(n),在检索源没有排序的情况下,这即为最

算法学习笔记

对于一个软件人员来说,算法和数据结构是无法逃避的,越是逃避说明越是需要继续学习和巩固.加深.转载一篇github上有关算法的文章,以便于进行继续学习和理解.当然并不是说非得全部掌握所有算法至少达到需要的时候会找,找到了会使,使完了能明白是什么东西才能更好的进行coding.这篇文章是有关C的 下次再弄个Java语言的算法部分.学无止境嘛,不能光看java也要学习学习C 学习方法 把所有经典算法写一遍 看算法有关源码 加入算法学习社区,相互鼓励学习 看经典书籍 刷题 原文地址:https://gi

分治算法学习 Divide and Conquer

分治思想: 分治算法的思想就是 对于某些特定种类的问题  如果问题的规模很小,那么就直接解决,如果问题的规模比较大,那么就把问题先分解为规模小的但是问题相同的子问题 ,并且不断分解直到规模足够小,再递归地解决这些问题 如果原问题可分割成k个子问题,1<k≤n,且这些子问题都可解并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的. 递归与分治经常是一起使用的 能够用分治的情况 : 1.问题复杂性随规模减小而减小 2.问题具有最优子结构性质        最优子结构:如果问题的最优解所包