快速排序法(二)
来源:互联网 发布:java面向对象还是过程 编辑:程序博客网 时间:2024/06/04 23:33
在 快速排序法(一) 中,每次将最左边的元素设为轴,而之前曾经说过,快速排序法的加速在于轴的选择,在这个例子中,只将轴设定为中间的元素,依这个元素作基准进行比较,这可以增加快速排序法的效率。
解法
在这个例子中,取中间的元素s作比较,同样的先得右找比s大的索引 i,然后找比s小的索引 j,只要两边的索引还没有交会,就交换 i 与 j 的元素值,这次不用再进行轴的交换了,因为在寻找交换的过程中,轴位置的元素也会参与交换的动作,例如:
41 24 76 11 45 64 21 69 19 36
首先left为0,right为9,(left+right)/2 = 4(取整数的商),所以轴为索引4的位置,比较的元素是45,您往右找比45大的,往左找比45小的进行交换:
41 24 76* 11 [45] 64 21 69 19 *36
41 24 36 11 45* 64 21 69 19* 76
41 24 36 11 19 64* 21* 69 45 76
[41 24 36 11 19 21] [64 69 45 76]
完成以上之后,再初别对左边括号与右边括号的部份进行递回,如此就可以完成排序的目的。
实例
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 s = number[(left+right)/2]; int i = left - 1; int j = right + 1; while(true) { // 向右找 while(number[++i] < s) ; // 向左找 while(number[--j] > s) ; if(i >= j) break; swap(number, i, j); } sort(number, left, i-1); // 对左边进行递回 sort(number, j+1, right); // 对右边进行递回 } } 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;} 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; } void quicksort(int number[], int left, int right) { int i, j, s; if(left < right) { s = number[(left+right)/2]; i = left - 1; j = right + 1; while(1) { while(number[++i] < s) ; // 向右找 while(number[--j] > s) ; // 向左找 if(i >= j) break; SWAP(number[i], number[j]); } quicksort(number, left, i-1); // 对左边进行递回 quicksort(number, j+1, right); // 对右边进行递回 } }
2 0
- 快速排序法(二)
- 快速排序法(二)
- 快速排序法(二)
- 快速排序(二)
- 快速排序(二)
- 快速排序(二)
- 排序(二)快速排序
- 快速排序法二(C)
- 排序算法(二)- 快速排序
- (高效率排序算法二)快速排序
- 内部排序(二)快速排序
- 排序算法(二):快速排序
- 排序算法(二) 快速排序
- 排序二 快速排序
- 排序算法二(归并排序、快速排序、希尔排序)
- 【基础算法】排序-复杂排序之二(快速排序)
- 简单排序Java实现(二):归并排序,快速排序
- 分治与递归(二)--- 快速排序
- 虚函数
- what is SOA Gateway
- 【CSDN常见问题解答】Swing监听组合键
- Target-Action模式
- DB2 SQL Error: SQLCODE=-668, SQLSTATE=57016错误解决方法
- 快速排序法(二)
- javaScriptDay2
- 如何利用Java的反射机制获取类属性(filed)以及对应的实例的值?
- Mysql编码问题
- Windows 7 在 windows 2008 里无法漫游用户配置文件的解决办法
- iOS开发笔记--atomic与nonatomic,assign,copy与retain的定义和区别
- OpenCV中feature2D学习——SURF和SIFT算子实现特征点检测
- android中APK开机自动运行
- AWR 的使用以及过程中的注意内容