入门之快速排序

 1 /*
 2 入门之快速排序
 3 时间复杂度:O(nlogn)
 4 最坏情况时时间复杂度能达到O(n^2)
 5 借鉴自算法导论
 6 */
 7 #include<iostream>
 8 using namespace std;
 9 int a[] = {3,7,8,5,4,6,2,1,3};
10 void quick_sort(int*,int,int);
11 void swap(int,int);
12 void print();
13 int main()
14 {
15     print();//排序前
16     quick_sort(a,0,8);
17     print();//排序后
18 }
19 void print()
20 {
21     for(int i=0; a[i]!=0; ++i)
22         cout << a[i] << " ";
23     cout << endl;
24 }
25 void swap(int x,int y)
26 {
27     int t = a[x];
28     a[x] = a[y];
29     a[y] = t;
30 }
31 void quick_sort(int a[],int l,int r)//将 <t 和 >=t 的分开
32 {
33     if(l >= r)
34         return ;
35     int t = a[r],j = l-1;//边界问题
36     for(int i=l; i<r; ++i)
37         if(a[i] < t)
38         {
39             ++j;
40             if(i != j)
41                 swap(i,j);
42         }
43     swap(j+1,r);
44     quick_sort(a,l,j);
45     quick_sort(a,j+2,r);
46 }
时间: 2024-10-22 20:36:08

入门之快速排序的相关文章

算法入门之快速排序

快速排序原理: 快速排序先把等待排序的集合打乱顺序,把第一个元素作为基准元素,为第二个元素和最后一个元素分配两个指针i和j,如果a[i]小于基准元素则i++,如果a[j]大于基准元素则j--,这样把大于基准元素的a[i]和小于基准元素的a[j]互换,以此类推,最终把基准元素与a[j]相交换,就得到一个a[j]左侧全部小于a[j],右侧全部大于a[j]的一个近似有序数组,然后按照如上步骤重新寻找每个被a[j]分开的数组中的分隔点,最终得到有序数组. 在通用排序中,一般都会选取快速排序来解决问题.

汇编入门之快速排序和数组遍历

原创文章,转载请注明:汇编入门之快速排序和数组遍历 1.程序内容描述 将两个数组X.Y进行从小到大的快速排序后,将两个数组相同的元素按照从大到小的顺序输出到Z中. 2.程序流程图 3.源代码 DATAS SEGMENT COUNT DW 20 BEGINC DW 0 X DB 4,3,5,7,9,0,3,7,8,9,5,4,5,7,1,6,3,6,1,0 Y DB 5,9,7,3,1,6,3,5,4,0,0,1,3,7,2,5,4,5,3,1 Z DB 6 DUP(?) ENT db ';',0

排序算法入门之快速排序(java实现)

快速排序也是一种分治的排序算法.快速排序和归并排序是互补的:归并排序将数组分成两个子数组分别排序,并将有序的子数组归并以将整个数组排序,会需要一个额外的数组:而快速排序的排序方式是当两个子数组都有序时,整个数组就自然有序了,快速排序可以不产生额外的数组. 对于小数组(N<=20),快速排序不如插入排序.所以,小数组建议使用其他排序. 快速排序可以由以下几步组成: 1.如果数组S中的元素个数是0或1,则返回. 2.取S中任一元素v,称为枢纽元. 3.将S中其余元素(除枢纽元)分为两部分,一部分是小

简单的实现快速排序(适合小白入门)

1 /* 2 此篇博文适用于像我一样的小白: 3 首先,你要大概了了解快排的基本原理: 4 快排的实现有网上很多种,我自认为下面这种相对好理解的: 5 废话不多说,上代码: 6 注:下面的实现对数组元素升序的快速排序方法: 7 8 */ 9 class QuickSort { 10 public static void main(String[] args) { 11 int[] a = {1, 8, 5, 9, 0, 2}; 12 13 int start = 0; 14 int end =

快速排序从入门到精通

1.基本算法 快速排序是一种分治的排序算法.它将一个数组分成两个子数组,再对这两个数组独立地排序.快速排序的大致过程如下图所示: 整个算法分为三步: 选择一个元素作为枢轴(pivot) 扫描并交换数组元素,使得小于枢轴的元素处于左边,大于枢轴的元素处于右边,这个过程称为切分(partition) 对枢轴左边部分和右边部分的元素递归调用快速排序算法 1.1 快速排序的代码实现 public static void sort(Comparable[] a) { sort(a, 0, a.length

ASP.NET MVC4入门到精通系列目录汇总(转)

序言 最近公司在招.NET程序员,我发现好多来公司面试的.NET程序员居然都没有 ASP.NET MVC项目经验,其中包括一些工作4.5年了,甚至8年10年的,许多人给我的感觉是:工作了4.5年,Web开发依旧停留在拖控件的水平,最最基本的算 法,递归.排序(我不要求快速排序,你会冒泡就行了)都不会,数据库方面,很基础的SQL都写不出,分组过滤也不会,更别提性能了,问下数据优化经验,除 了回答加索引基本就没下文了.当然,一些过去N年都是做ASP.NET WebForm开发的,不熟悉MVC,那也没

交换排序之冒泡排序和快速排序

交换排序 所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动. 排序入门之冒泡排序 冒泡排序是典型的交换排序算法.冒泡排序的时间复杂度为O(n2),可以说效率比较低,但是,冒泡排序体现的思想是学习排序算法很好的入门,尤其是对学习快速排序(在冒泡排序基础之上发展起来的)很有帮助. 基本思想 冒泡排序的基本思想是,进行(最多进行)n-1趟冒泡,其中n为数据的个数,其中每次冒泡会将未排序的最大

《算法竞赛入门经典(第二版)》pdf

下载地址:网盘下载 内容简介  · · · · · · <算法竞赛入门经典(第2版)>是一本算法竞赛的入门与提高教材,把C/C++语言.算法和解题有机地结合在一起,淡化理论,注重学习方法和实践技巧.全书内容分为12 章,包括程序设计入门.循环结构程序设计.数组和字符串.函数和递归.C++与STL入门.数据结构基础.暴力求解法.高效算法设计.动态规划初步.数学概念与方法.图论模型与算法.高级专题等内容,覆盖了算法竞赛入门和提高所需的主要知识点,并含有大量例题和习题.书中的代码规范.简洁.易懂,不

算法竞赛之排序算法初入门

关于排序的一些知识点 排序是计算机内经常进行的一种操作,其目的是将一组"无序"的记录序列调整为"有序"的记录序列.我们学习的排序是关于算法之中,对一些特定数据,按照一定的优先级顺序将数据及逆行合理化的排列,比如在最初学习C语言的时候,老师提到的冒泡排序.选择排序,这两个是基本的排序,原理也应该比较简单,其实最早接触到的就是两个数字比较大小,然后按升序或者降序排布的,这个应该是最早接触的排序了. 既然排序这么重要,我们就学习一下一些常见的排序算法吧,由于本人能力有限,