快速排序法(三)
来源:互联网 发布:数据库的三级模式 编辑:程序博客网 时间:2024/05/15 08:16
之前说过轴的选择是快速排序法的效率关键之一,在这边的快速排序法的轴选择方式更加快了快速排序法的效率,它是来自演算法名书 Introduction to Algorithms 之中。
解法
先说明这个快速排序法的概念,它以最右边的值s作比较的标准,将整个数列分为三个部份,一个是小于s的部份,一个是大于s的部份,一个是未处理的部份,如下所示 :
在排序的过程中,i 与 j 都会不断的往右进行比较与交换,最后数列会变为以下的状态:
然后将s的值置于中间,接下来就以相同的步骤会左右两边的数列进行排序的动作,如下所示:
整个演算的过程,直接摘录书中的虚拟码来作说明:
QUICKSORT(A, p, r)
if p < r
then q <- PARTITION(A, p, r)
QUICKSORT(A, p, q-1)
QUICKSORT(A, q+1, r)
end QUICKSORT
PARTITION(A, p, r)
x <- A[r]
i <- p-1
for j <- p to r-1
do if A[j] <= x
then i <- i+1
exchange A[i]<->A[j]
exchange A[i+1]<->A[r]
return i+1
end PARTITION
一个实际例子的演算如下所示:
快速排序
实例
Java 写法
public class QuickSort { public static void sort(int[] number) { sort(number, 0, number.length-1); } private static void sort(int[] number, int left, int right) { if(left < right) { int q = partition(number, left, right); sort(number, left, q-1); sort(number, q+1, right); } } private static int partition(int number[], int left, int right) { int s = number[right]; int i = left - 1; for(int j = left; j < right; j++) { if(number[j] <= s) { i++; swap(number, i, j); } } swap(number, i+1, right); return i+1; } private static void swap(int[] number, int i, int j) { int t; t = number[i]; number[i] = number[j]; number[j] = t; }}
C 写法
#include <stdio.h> #include <stdlib.h> #include <time.h> #define MAX 10 #define SWAP(x,y) {int t; t = x; x = y; y = t;} int partition(int[], int, int); void quicksort(int[], int, int); int main(void) { int number[MAX] = {0}; int i, num; srand(time(NULL)); printf("排序前:"); for(i = 0; i < MAX; i++) { number[i] = rand() % 100; printf("%d ", number[i]); } quicksort(number, 0, MAX-1); printf("\n排序后:"); for(i = 0; i < MAX; i++) printf("%d ", number[i]); printf("\n"); return 0; } int partition(int number[], int left, int right) { int i, j, s; s = number[right]; i = left - 1; for(j = left; j < right; j++) { if(number[j] <= s) { i++; SWAP(number[i], number[j]); } } SWAP(number[i+1], number[right]); return i+1; } void quicksort(int number[], int left, int right) { int q; if(left < right) { q = partition(number, left, right); quicksort(number, left, q-1); quicksort(number, q+1, right); } }
- 快速排序法(三)
- 快速排序法(三)
- 快速排序法(三)
- 快速排序(三)
- 三种快速排序法
- Algorithm(三):快速排序
- 【十七】排序算法(三)--快速排序
- 排序算法(三) 快速排序
- 算法学习(排序三)快速排序
- 【排序三】交换排序(冒泡排序&&快速排序)
- 排序(三)堆排序、归并排序、快速排序
- 排序算法(三)------冒泡排序和快速排序
- 常见排序算法整理(三)----归并排序、快速排序
- 快速排序的三路划分法
- 3-8 三路快速排序法
- 算法系列(三) 快速排序
- 分治算法三(随机化快速排序)
- 算法导论(三) 快速排序
- LeetCode - Evaluate Reverse Polish Notation
- Thinking in Java final关键字
- LeetCode | Binary Tree Preorder Traversal
- Ubuntu12.04下Linux内核编译
- 从汽车之家上市谈电商
- 快速排序法(三)
- 一些特有有益处的网站
- elephant-bird的安装和使用
- 多class应用同一个元素时,后声明的class规则将覆盖先声明的
- ios 开发过程中常见问题
- php的扩展和嵌入--php的生命周期与变量详述
- 关于maven打包时出现jar包版本的多重引用导致最终war包里的版本不是最新的
- SurfaceView的介绍
- Mac下svn command命令