算法 排序算法--快速排序

快速排序是对冒泡法排序的一种改进。

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

可能仅根据基本思想对快速排序的认识并不深,接下来以对n个无序数列A[0], A[1]…, A[n-1]采用快速排序方法进行升序排列为例进行讲解。

(1)定义两个变量low和high,将low、high分别设置为要进行排序的序列的起始元素和最后一个元素的下标。第一次,low和high的取值分别为0和n-1,接下来的每次取值由划分得到的序列起始元素和最后一个元素的下标来决定。

(2)定义一个变量val,通 常,val值为要进行排序序列的第一个元素值。第一次的取值为A[0]。

(3)从high所指向的数组元素开始向左扫描,扫描的同时将下标为high的数组元素依次与val进行比较操作,直到high不大于low或找到第一个小于val的数组元素,然后将该值赋值给low所指向的数组元素, 然后就不移动high。

(4)如果low依然小于high,那么由low所指向的数组元素开始向右扫描,扫描的同时将下标为low的数组元素值依次与val进行比较操作,直到low不小于high或找到第一个大于val的数组元素,然后将该值赋给high所指向的数组元素。

(5)重复步骤(3) (4),直到low=high为止,这时成功划分后得到的左右两部分分别为A[low……pos-1]和A[pos+1……high],其中,pos下标所对应的数组元素的值就是val,所以在划分结束时还要将下标为pos的数组元素赋值 为 val。 PS:经过一轮比较,只是找到了val的位置,其他数组元素依然是无序的。

(6)将划分得到的左右两部分A[low……pos-1]和A[pos+1……high]继续采用以上操作步骤进行划分,直到得到有序序列为止。

为了能够加深读者的理解,接下来通过一段代码来了解快速排序的具体实现方法。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define N 6
 4 int findPos(int arr[], int low, int high){
 5     int val;
 6     val = arr[low];
 7     while(low<high){
 8         while(low <high && arr[high]>= val )
 9             high--;
10         arr[low] = arr[high];
11
12         while( low<high && arr[low]<=val )
13             low++;
14         arr[high] = arr[low];
15     }
16     arr[low] = val;
17     return low;
18 }
19 void quick_sort(int arr[], int low, int high){
20     int pos;
21     if (low<high){
22         pos = findPos(arr, low, high);
23         quick_sort(arr,low,pos-1);
24         quick_sort(arr,pos+1,high);
25     }
26     return;
27 }
28 int main(void){
29     int i;
30     int arr[N]={32,12,7, 78, 23,45};
31     printf("排序前 \n");
32     for(i=0;i<N;i++)
33         printf("%d\t",arr[i]);
34     quick_sort(arr,0,N-1);
35     printf("\n 排序后 \n");
36     for(i=0; i<N; i++)
37         printf("%d\t", arr[i]);
38     printf ("\n");
39     system("pause");
40     return 0;
41 }

运行结果:

排序前
32    12    7    78    23    45
排序后
7    12    23    32    45    78

在上面的代码中,根据前面介绍的步骤一步步实现了快速排序算法。接下来通过示意图来演示快速排序。

1>开始是:

2>因为high指向的45比32大,所以high往左移

3>因为high指向的23比32小,所以把23赋值给low

4>因为low指向的23比32小,所以向右移low

5>因为low指向的12比32小,所以向右移low

6>因为low指向的7比32小,所以向右移low

7>因为low指向的78比32大,所以把78赋值给high

8>因为high指向的78比32大,所以向左移high

9>至此low和high重合,low的位置就是Val的最终位置

10>然后low到pos-1范围内的数组元素,再按上述的操作做排序

11>然后pos+1到high范围内的数组元素,再按上述的操作做排序

时间: 2024-11-05 21:58:23

算法 排序算法--快速排序的相关文章

数据结构与算法-排序算法-partial

前言 都什么时代了,还写排序算法的总结? 原因有二.一是别人的精彩永远是别人的,你只有鼓掌的份儿:有些事情实际动手去做了才会有所体会. 二是排序算法是一类基础类的算法,不光是IT从业者真正入门的门槛,也是一些高级算法的关键部分或算法评估的benchmark. 计划说明的算法内容有哪些?  算法的思想.Java代码实现和平均算法复杂度.算法运行完整示例. 参考文献有哪些? wiki[EB/OL] Shaffer C. A. Data Structure and Algorithm Analysis

数据结构和算法-排序算法-冒泡排序

##################     排序算法        ###################### """ 排序算法, 我们想要把线性表中的无序序列,排成有序序列,的算法,就是排序算法, 排序算法的稳定性 举例:假设对下面的元组要以他们的第一个数字来排序. (4, 1) (3, 1) (3, 7)(5, 6) 如果你排序之后,(3, 1) (3, 7)和原来的顺序一样,就是稳定的,否则就是不稳定的, (3, 1) (3, 7) (4, 1) (5, 6) (维

php 实现冒泡算法排序、快速排序、选择排序,插入排序

许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一个初级phper,虽然很少接触到算法方面的东西 .但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要掌握的.下面是我按自己的理解,将四个方法分析一遍. 需求:分别用 冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中 的值按照从小到的顺序进行排序.  $arr(1,43,54,62,21,66,32,78,36,76,39); 1. 冒泡排序法   *     思路分析:法如其名,就是像冒

JavaScript算法-排序算法

? 此生之路,我将走过:走过这一次,便再也无法重来.所有力所能及的善行,所有充盈于心的善意,我将毫不吝惜,即刻倾予.我将再不拖延,再不淡漠,只因此生之路,再也无法重来. 对计算机中存储的数据执行的两种最常见操作是排序和索引.下述阐述的排序方式,暂且都是用数组进行测试(从小到大). var dataAry = [5, 4, 3, 7, 1, 2, 8, 6, 9]; // 测试数组 /** *[工具方法]交换数组中两个值 * @param ary 数组 * @param i 下标i * @para

数据结构与算法——排序算法

常见排序算法主要有: 插入排序(直接插入排序.希尔排序) 选择排序(直接选择排序.堆排序) 交换排序(冒泡排序.快速排序) 归并排序 基数排序 外部排序 一.直接插入排序 算法思想:在一个待排序列中,从第二个元素开始,依次进行排序,每次都将待排序元素从后往前,依次与前面的元素进行比较,从而将带排序元素移动到一个合适的位置,直到最后一个待排序元素移动到合适位置,则排序完成. 算法特点:最好情况下时间复杂度O(n),最坏情况下时间复杂度O(n2),稳定排序算法 二.希尔排序 希尔排序算法基础:待排序

[数据结构与算法]排序算法(Python)

1.直接插入排序 给定一个数组后,从第二个元素开始,如果比第一个小,就跟他交换位置,否则不动:第三个元素如果比第二个小,把第三个跟第二个交换位置,在把第二个与第一个比较:..... def insert_sort(arr): length = len(arr) for i in range(1,length): if arr[i] < arr[i-1]: for j in range(i-1,-1,-1): if arr[j+1] < arr[j]: arr[j+1],arr[j] = arr

《算法 - 排序算法》

一:参考 - 十大经典排序算法动画与解析,看我就够了!(配代码完全版) - 这个动画很形象了,自己也对排序算法重新总结了下(PHP版本) - Github Sort 二:算法详解 <?php /** * https://www.cnblogs.com/fivestudy/p/10212306.html * 排序算法 时间复杂度 最优 最差 稳定性 * 冒泡排序 O(n^2) O(n) O(n^2) 稳定 * 选择排序 O(n^2) O(n^2) O(n^2) 不稳定 * 插入排序 O(n^2)

数据结构与算法---排序算法(Sort Algorithm)

排序算法的介绍 排序也称排序算法 (Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程. 排序的分类 1) 内部排序: 指将需要处理的所有数据都加载 到内部存储器(内存)中进行排序. 2) 外部排序法:数据量过大,无法全部加载到内 存中,需要借助外部存储(文件等)进行 排序. 常见的排序算法分类 算法的时间复杂度 度量一个程序(算法)执行时间的两种方法 1.事后统计的方法这种方法可行, 但是有两个问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该程序: 二是所

算法 排序算法--冒泡排序

冒泡排序是排序算法的一种,思路清晰,代码简洁,常被用在大学生计算机课程中. “冒泡”这个名字的由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名. 这里以从小到大排序为例进行讲解. 基本思想及举例说明 冒泡排序的基本思想就是不断比较相邻的两个数,让较大的元素不断地往后移.经过一轮比较,就选出最大的数:经过第2轮比较,就选出次大的数,以此类推. 下面以对 3  2  4  1 进行冒泡排序说明. 第一轮 排序过程3  2  4  1    (最初)2  3  4  2    (比较3和2,

算法 排序算法--选择排序

选择排序是排序算法的一种,这里以从小到大排序为例进行讲解. 基本思想及举例说明 选择排序(从小到大)的基本思想是,首先,选出最小的数,放在第一个位置:然后,选出第二小的数,放在第二个位置:以此类推,直到所有的数从小到大排序. 在实现上,我们通常是先确定第i小的数所在的位置,然后,将其与第i个数进行交换. 下面,以对 3  2  4  1 进行选择排序说明排序过程,使用min_index 记录当前最小的数所在的位置. 第1轮 排序过程 (寻找第1小的数所在的位置)3  2  4  1(最初, mi