C语言的快速排序的算法是什么啊?

作者&投稿:鬱裕 (若有异议请与网页底部的电邮联系)
快速排序算法原理与实现~

快速排序的基本思想就是从一个数组中任意挑选一个元素(通常来说会选择最左边的元素)作为中轴元素,将剩下的元素以中轴元素作为比较的标准,将小于等于中轴元素的放到中轴元素的左边,将大于中轴元素的放到中轴元素的右边。
然后以当前中轴元素的位置为界,将左半部分子数组和右半部分子数组看成两个新的数组,重复上述操作,直到子数组的元素个数小于等于1(因为一个元素的数组必定是有序的)。
以下的代码中会常常使用交换数组中两个元素值的Swap方法,其代码如下
public static void Swap(int[] A, int i, int j){
int tmp;
tmp = A[i];
A[i] = A[j];
A[j] = tmp;

扩展资料:
快速排序算法 的基本思想是:将所要进行排序的数分为左右两个部分,其中一部分的所有数据都比另外一 部分的数据小,然后将所分得的两部分数据进行同样的划分,重复执行以上的划分操作,直 到所有要进行排序的数据变为有序为止。
定义两个变量low和high,将low、high分别设置为要进行排序的序列的起始元素和最后一个元素的下标。第一次,low和high的取值分别为0和n-1,接下来的每次取值由划分得到的序列起始元素和最后一个元素的下标来决定。
定义一个变量key,接下来以key的取值为基准将数组A划分为左右两个部分,通 常,key值为要进行排序序列的第一个元素值。第一次的取值为A[0],以后毎次取值由要划 分序列的起始元素决定。
从high所指向的数组元素开始向左扫描,扫描的同时将下标为high的数组元素依次与划分基准值key进行比较操作,直到high不大于low或找到第一个小于基准值key的数组元素,然后将该值赋值给low所指向的数组元素,同时将low右移一个位置。
如果low依然小于high,那么由low所指向的数组元素开始向右扫描,扫描的同时将下标为low的数组元素值依次与划分的基准值key进行比较操作,直到low不小于high或找到第一个大于基准值key的数组元素,然后将该值赋给high所指向的数组元素,同时将high左移一个位置。
重复步骤(3) (4),直到low的植不小于high为止,这时成功划分后得到的左右两部分分别为A[low……pos-1]和A[pos+1……high],其中,pos下标所对应的数组元素的值就是进行划分的基准值key,所以在划分结束时还要将下标为pos的数组元素赋值 为 key。
参考资料:快速排序算法_百度百科

1、“快速排序法”使用的是递归原理,下面一个例子来说明“快速排序法”的原理。首先给出一个数组{53,12,98,63,18,72,80,46, 32,21},先找到第一个数--53,把它作为中间值,也就是说,要把53放在一个位置,使得它左边的值比它小,右边的值比它大。{21,12,32, 46,18,53,80,72,63,98},这样一个数组的排序就变成了两个小数组的排序--53左边的数组和53右边的数组,而这两个数组继续用同样的方式继续下去,一直到顺序完全正确。一般来说,冒泡法是程序员最先接触的排序方法,它的优点是原理简单,编程实现容易,但它的缺点就是速度太慢。2、快速排序代码:
#includevoid quicksort(int a[],int left,int right){ int i,j,temp; i=left; j=right; temp=a[left]; if(left>right) return; while(i!=j) { while(a[j]>=temp&&j>i) j--; if(j>i) a[i++]=a[j]; while(a[i]i) i++; if(j>i) a[j--]=a[i]; } a[i]=temp; quicksort(a,left,i-1); quicksort(a,i+1,right);}void main(){ int a[]={53,12,98,63,18,72,80,46,32,21}; int i; quicksort(a,0,9); /*排好序的结果*/ for(i=0;i<10;i++) printf("%4d
",a[i]);}

快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 算法过程  设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。   一趟快速排序的算法是:   1)设置两个变量I、J,排序开始的时候:I=0,J=N-1;   2)以第一个数组元素作为关键数据,赋值给key,即 key=A[0];   3)从J开始向前搜索,即由后开始向前搜索(J=J-1),找到第一个小于key的值A[J],并与key交换;   4)从I开始向后搜索,即由前开始向后搜索(I=I+1),找到第一个大于key的A[I],与key交换;   5)重复第3、4、5步,直到 I=J; (3,4步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。找到并交换的时候i, j指针位置不变。另外当i=j这过程一定正好是i+或j-完成的最后另循环结束。)   例如:待排序的数组A的值分别是:(初始关键数据:X=49) 注意关键X永远不变,永远是和X进行比较,无论在什么位子,最后的目的就是把X放在中间,小的放前面大的放后面。   A[0] A[1] A[2] A[3] A[4] A[5] A[6]:   49 38 65 97 76 13 27   进行第一次交换后:27 38 65 97 76 13 49   ( 按照算法的第三步从后面开始找)   进行第二次交换后:27 38 49 97 76 13 65   ( 按照算法的第四步从前面开始找>X的值,65>49,两者交换,此时:I=3 )   进行第三次交换后:27 38 13 97 76 49 65   ( 按照算法的第五步将又一次执行算法的第三步从后开始找   进行第四次交换后:27 38 13 49 76 97 65   ( 按照算法的第四步从前面开始找大于X的值,97>49,两者交换,此时:I=4,J=6 )   此时再执行第三步的时候就发现I=J,从而结束一趟快速排序,那么经过一趟快速排序之后的结果是:27 38 13 49 76 97 65,即所有大于49的数全部在49的后面,所有小于49的数全部在49的前面。   快速排序就是递归调用此过程——在以49为中点分割这个数据序列,分别对前面一部分和后面一部分进行类似的快速排序,从而完成全部数据序列的快速排序,最后把此数据序列变成一个有序的序列,根据这种思想对于上述数组A的快速排序的全过程如图6所示:   初始状态 {49 38 65 97 76 13 27}   进行一次快速排序之后划分为 {27 38 13} 49 {76 97 65}   分别对前后两部分进行快速排序 {27 38 13} 经第三步和第四步交换后变成 {13 27 38} 完成排序。   {76 97 65} 经第三步和第四步交换后变成 {65 76 97} 完成排序。   

就是一种算法, 算法的时间复杂度为 nlgn。 是一种排序速度很快的算法, 同时也是不稳定排序算法!

你说的可能是除了冒泡法的方法吧应该是这样的 Array.Sort(数组名)// 把数组升序 Array.Reverse(数组名) //把数组的顺序颠倒 还望采纳


快速排序算法在平均情况下的时间复杂度为 求详解
时间复杂度为O(nlogn) n为元素个数 1. 快速排序的三个步骤:1.1. 找到序列中用于划分序列的元素 1.2. 用元素划分序列 1.3. 对划分后的两个序列重复1,2两个步骤指导序列无法再划分 所以对于n个元素其排序时间为 T(n) = 2*T(n\/2) + n (表示将长度为n的序列划分为两个子序列,每个子...

内部排序算法中,快速排序和堆排序的时间复杂性有何区别?
快速排序算法详解:C语言实现的魅力与效率 在数据处理的世界里,排序算法是不可或缺的基石,内部排序与外部排序各有其适用场景。内部排序,如插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序和堆排序,它们在内存中运作,各有时间复杂性的特性:简单排序,如冒泡排序(O(n²))和选择...

选择排序与快速排序
选择排序的方法,就是遍历你的列表。找出次数最多的那条记录,然后添加到新列表中。看看需要多长时间 :O(n)时间意味着查看列表中的每个元素一次,例如,对乐队列表进行简单查找时,意味着每个乐队都要查看一次。快速排序是一种常用的排序算法,比选择排序快得多。例如,C语言标准库中的函数qsort实现的就...

python几种经典排序方法的实现
比较排序:通过对数组中的元素进行比较来实现排序。非比较排序:不通过比较来决定元素间的相对次序。算法复杂度冒泡排序比较简单,几乎所有语言算法都会涉及的冒泡算法。冒泡排序冒泡排序,BubbleSort,是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。

数据结构C语言--三种以上的排序算法
快速排序:void QSort(int a[], int l, int r) \/\/单关键字交换法快排 { int i = l, j = r, mid = (i + j) \/ 2; \/\/二分[i,j]区间 while (i <= j) \/\/让a[mid]左边都比a[mid]小,右边都比a[mid]大 { while (a[i] < a[mid]) \/\/找到一个元素a[i]...

用C语言编程实现快速排序算法
给个快速排序你参考参考 \/*** 快速排序 ***基本思想:在待排序的n个记录中任取一个记录(通常取第一个记录), 以该记录为基准,将当前的无序区划分为左右两个较小的无 序子区,使左边的记录均小于基准值,右边的记录均大于或 等于基准值,基准值位于两个无序区的中间位置(即该记录 最...

C语言中说的按字典顺序是什么意思?
a < b;aa < ab; 因为第二位置上,前面字符串是a,后面字符串是b,所以是小于关系,以此类推。C语言排序算法:快速排序:1、假设我们给一个int数组进行排序,数组中数字初始序列为int a[9]={3,6,5,9,7,1,8,2,4} 2、分析快速排序的原理前,我们先声明一些东西,首先设置一个临时变量...

冒泡排序法和快速排序比较的算法
产生1000个随机数,分别用两种方法来进行排序。给出各自的排序思路。要求比较冒泡排序和快速排序的效率,给出各自的排序时间及结果,交:1.程序的代码(冒泡、快速)2.给出时间3.前20... 产生1000个随机数,分别用两种方法来进行排序。给出各自的排序思路。要求比较冒泡排序和快速排序的效率,给出各自的排序时间及结果,...

C语言 各常见排序法的时间复杂度 急 请简单说明
选择排序算法复杂度是O(n^2)。插入排序是O(n^2)快速排序快速排序是不稳定的。最理想情况算法时间复杂度O(nlog2n),最坏O(n^2)。堆排序算法时间复杂度O(nlogn)。归并排序的时间复杂度是O(nlog2n)。

怎样用C语言对一串整行数从大到小排序
算法思想简单描述: 快速排序是对冒泡排序的一种本质改进。它的基本思想是通过一趟 扫描后,使得排序序列的长度能大幅度地减少。在冒泡排序中,一次 扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只 减少1。快速排序通过一趟扫描,就能确保某个数(以它为基准点吧) 的左边各数都比它小,右边各数都比...

荔城区13656452084: C语言的快速排序的算法是什么啊? -
逄强华乐: 快速排序(Quicksort)是对冒泡排序的一种改进.由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数...

荔城区13656452084: 什么是C语言中的快速排序法?
逄强华乐: 用每次取的数据作为分界点,在这之内分成2块 先和最后面的数据比较,当大于时就互换位置,在和前面的数据比较 设置low 和high个指针先与high(也就是最后一个关键字比较)大于就互换位置否则就不换指导换了一次位置后改变high的位置,在与low比较小于就互换直到交换就重置low,在high就这样循环,直到high=low的时候就完成了一次 再在分开的2个区内用同样的方法比较……以此类推……

荔城区13656452084: 快速排序算法 -
逄强华乐: C语言程序: /* 快 速 排 序 */ #include "stdio.h" void QuickSort(int e[], int first, int end) { int i=first,j=end,temp=e[first];,xgXBjE

荔城区13656452084: 用C语言写一个快速排序法,不要用库函数 -
逄强华乐: include<stdio.h> void main() {int a[]={8,4,24,1,54,87,113,39};//这里的元素可以手动输入,用for循环输入,先给定数组长度N //再一次输入数组元素 /* int n; scanf("&%d",n); for(int =0;i<n;i++)scanf("&%d",&a[i]); */ for(int i=0;i<8;i++){for(int j...

荔城区13656452084: c语言实现快速排序 -
逄强华乐: 如果装了VC的运行库源代码就自己看吧. VC\crt\src\qsort.c 有足够的注释了.

荔城区13656452084: c语言快排方法.要详细解析,悬赏随意可追加
逄强华乐:#include <stdio.h> #include <string.h> #define swap(x,y) (x = (y + x) - (y = x)) #define dim(x) sizeof(x) / sizeof(x[0]) //快速排序 //一趟快速排序的算法 //设置两个变量i 、j 以第一个数组元素作为关键数据,赋值给key 即key = A[0]; //注意key值在整个过...

荔城区13656452084: 用C语言编程实现快速排序算法 -
逄强华乐: 给个快速排序你参考参考 /********************** 快速排序 **************************** 基本思想:在待排序的n个记录中任取一个记录(通常取第一个记录), 以该记录为基准,将当前的无序区划分为左右两个较小的无 序子区,使左边的记录均小于基...

荔城区13656452084: c语言中的排序算法? -
逄强华乐: 选择,冒泡,快排,堆排,基数,计数,二叉树,插入,归并,希尔排序,等等..

荔城区13656452084: C语言的快速排序法 -
逄强华乐: 官方经典快速排序算法 /* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option...

荔城区13656452084: 用C语言编写函数,要实现快速排序算法或者冒泡法 -
逄强华乐: 冒泡法排序函数如下: void bubble(int a[],int n) {int i,j,t;for(i=0;i<n-1;i++)/*共进行n-1轮*/for(j=0;j<n-1-i;j++)/*每轮在前n-i个数中比较*/if(a[j]>a[j+1]) /*若相邻元素逆序*/ {t=a[j]; a[j]=a[j+1];a[j+1]=t;}/*就交换*/ }void sort(int *a, int left, int right) {if(...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网