【东东学数据结构】快速排序
2012-03-21 14:35
155 查看
快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实作出来,且在大部分真实世界的资料,可以决定设计的选择,减少所需时间的二次方项之可能性。
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。然后分别递归的排序关键数据前面和后面两段数据。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
在具体实现上,如何吧将所有比它小的数都放到它前面,所有比它大的数都放到它后面是关键。也有不同的版本。先来第一个版本:
第二个版本:
推荐使用第一个版本,比较好理解。最后,发一个对应版本二的动画演示:
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。然后分别递归的排序关键数据前面和后面两段数据。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
在具体实现上,如何吧将所有比它小的数都放到它前面,所有比它大的数都放到它后面是关键。也有不同的版本。先来第一个版本:
import java.util.Arrays; import java.util.Random; /** * User: laichendong * Date: 12-3-14 * Time: 上午9:57 */ public class QuickSort { private static Random random = new Random(); public static void main(String[] args) { int[] array = {49, 38, 52, 44, 81, 97, 76, 13, 27, 65}; qsort(array, 0, array.length - 1); System.out.println(Arrays.toString(array)); } private static int partionSort(int[] array, int begin, int end) { int index = begin + random.nextInt(end - begin + 1); int key = array[index]; swap(array, index, end); for (int k = index = begin; k < end; k++) { if (array[k] < key) { swap(array, index, k); index++; } } swap(array, index, end); return index; } private static void qsort(int[] array, int begin, int end) { if (begin < end) { int index = partionSort(array, begin, end); qsort(array, begin, index - 1); qsort(array, index, end); } } private static void swap(int[] a, int i, int j) { int t = a[i]; a[i] = a[j]; a[j] = t; } }
第二个版本:
import java.util.Arrays; import java.util.Random; /** * User: laichendong * Date: 12-3-14 * Time: 上午9:57 */ public class QuickSort { private static Random random = new Random(); public static void main(String[] args) { int[] array2 = {49, 38, 52, 44, 81, 97, 76, 13, 27, 65}; qsort2(array2, 0, array2.length - 1); System.out.println(Arrays.toString(array2)); } private static void qsort2(int[] array, int begin, int end) { if (begin < end) { int index = partionSort2(array, begin, end); if(begin < end - 1){ qsort(array, begin, index - 1); qsort(array, index, end); } } } private static int partionSort2(int[] array, int begin, int end){ int key = array[begin]; int i = begin; int j = end; while (i <= j){ if(array[j] <= key){ if(array[i] >= key){ swap(array, i, j); j--; }else { i++; } }else{ j--; } } return i; } private static void swap(int[] a, int i, int j) { int t = a[i]; a[i] = a[j]; a[j] = t; } }
推荐使用第一个版本,比较好理解。最后,发一个对应版本二的动画演示:
相关文章推荐
- 数据结构-排序算法详解(插入排序,希尔排序,堆排序,归并排序,快速排序,桶式排序)
- 数据结构----快速排序
- 【东东学数据结构】选择排序
- 数据结构 - 快速排序
- 数据结构--冒泡、快速排序
- 快速排序的优化 - 数据结构和算法97
- 数据结构 快速排序
- 数据结构学习笔记3.2—快速排序
- 数据结构排序之快速排序
- C++代码,数据结构-内部排序-交换排序-快速排序
- c++实现数据结构中的各种排序方法:直接插入、选择,归并、冒泡、快速、堆排序、shell排序
- [数据结构]第八次作业:快速排序
- 数据结构- 快速排序
- 算法与数据结构——快速排序 Quick Sort
- 数据结构和算法13 之快速排序
- 数据结构排序-快速排序
- 快速排序----C语言数据结构
- 数据结构各种排序法及核心思想(冒泡、鸡尾酒、选择、插入、二分法、希尔、堆、归并、快速)
- 黑马程序员之数据结构学习笔记:快速排序
- 【数据结构】常用比较排序算法(包括:选择排序,堆排序,冒泡排序,选择排序,快速排序,归并排序)