快速排序(算法导论)

小鱼儿 2022-06-15 12:57 305阅读 0赞

本算法翻译自算法导论第三版(中文版)第7章170(有兴趣的可以看看,我感觉这本书还是跟晦涩的,可能我也没多读几次的原因);

1、快速排序介绍
快速排序是一种在实际排序应用中最好的选择,因为他平均的性能非常好,它的期望复杂度是O(nlgn),快速排序也使用了分治的思想
2操作思路
(1)分解
首先先将问题分解成子问题。
(2)解决
递归调用快速排序对各个子问题进行求解。
(3)合并
无需合并,而归并排序需要进行合并。
伪代码
这段代码主要是为了分解子问题
而解决子问题的快速排序在PARTITION中

  1. QUCIKSORT(A,p,r)
  2. if p < r
  3. q=PARTITION(A,p,r)
  4. QUICKSORT(A,p,r)
  5. QUICKSORT(A,p,r)
  6. PARTITION(A,p,r)
  7. x=A[r];
  8. i=p-1;
  9. for j=p to r-1
  10. if A[j]<=x
  11. i=i+1
  12. exchange A[j] with A[i]
  13. exchange A[i+1] with A[end]
  14. return i+1;

我的java实现
代码一:

  1. import java.util.Arrays;
  2. public class QuickSortTest {
  3. private int[] element;
  4. public QuickSortTest(int[] e) {
  5. element = e;
  6. }
  7. public static void main(String[] args) {
  8. int[] array = { 2,8,7,1,3,5,6,4 };
  9. QuickSortTest quick = new QuickSortTest(array);
  10. quick.sort();
  11. System.out.println("result"+quick);
  12. }
  13. public void sort() {
  14. quickSort(element, 0, element.length-1);
  15. }
  16. private void quickSort(int[] array, int start, int end) {
  17. if(start<end){
  18. int loc=partition(array,start,end);
  19. quickSort(array,start,loc-1);
  20. quickSort(array,loc+1,end);
  21. }
  22. }
  23. private int partition(int[] array, int start, int end) {
  24. System.out.println("开始于"+start+" 终于"+end);
  25. int x=array[end];
  26. /* * 此处用i j两个变量进行记录需要交换的位置 * j采用 if判断 出比x小的位置 * i那么 留下来的默认就比x大 */
  27. int i =start-1;
  28. for(int j=start;j<end;j++){
  29. if(array[j]<=x){
  30. i++;
  31. swap(array,i,j);
  32. System.out.println("交换后:"+toString());
  33. }
  34. }
  35. //交换基准点
  36. System.out.println("交换基准点"+array[i+1]+" "+array[end]);
  37. swap(array,i+1,end);
  38. System.out.println("某次交换结果:"+toString());
  39. return i+1;
  40. }
  41. /**交换i和j的值*/
  42. private void swap(int[] array,int i,int j){
  43. System.out.println("交换"+array[i]+" "+array[j]);
  44. int temp = array[i];
  45. array[i]=array[j];
  46. array[j]=temp;
  47. }
  48. public String toString(){
  49. return Arrays.toString(element);
  50. }
  51. }

代码二 采用数据结构书(严蔚敏版)上实现的

  1. import java.util.Arrays;
  2. public class QuickSortTest {
  3. private int[] element;
  4. public QuickSortTest(int[] e) {
  5. element = e;
  6. }
  7. public static void main(String[] args) {
  8. int[] array = { 49, 38, 65, 97, 76, 13, 27 };
  9. // int[] array = { 2,8,7,1,3,5,6,4 };
  10. QuickSortTest quick = new QuickSortTest(array);
  11. quick.sort();
  12. System.out.println("result" + quick);
  13. }
  14. public void sort() {
  15. quickSort(element, 0, element.length - 1);
  16. }
  17. private void quickSort(int[] array, int start, int end) {
  18. if (start < end) {
  19. int loc = partition2(array, start, end);
  20. quickSort(array, start, loc - 1);
  21. quickSort(array, loc + 1, end);
  22. }
  23. }
  24. private int partition2(int[] array, int i, int j) {
  25. int key = array[i]; // 将第一个值作为基准值
  26. while (i < j) {
  27. while (i < j && key <= array[j])
  28. j--; // j向左移 直到找到比key小的值
  29. if (i < j) { //此处不保证会引起的问题 上一步可能是i>=j所引起的跳出,而不是key<=array 所引起的
  30. array[i++] = array[j]; // 交换值 每次交换的时候虽然会覆盖但是不会造成数据的丢失
  31. // 因为key记录了一个位置
  32. System.out.println(i - 1 + " " + j);
  33. System.out.println("左侧交换较小值" + this);
  34. }
  35. while (i < j && key > array[i])
  36. i++;
  37. if (i < j) {
  38. if(i>=j)System.out.println(i+" "+j+"错误测试2");
  39. array[j--] = array[i];
  40. System.out.println(i + " " + (j+1));
  41. System.out.println("右侧交换较大值" + this);
  42. }
  43. }
  44. array[i] = key;
  45. System.out.println(this);
  46. return i;
  47. }
  48. public String toString() {
  49. return Arrays.toString(element);
  50. }
  51. }

仅仅修改了partition的实现方式,感觉第一版更加容易理解。C和java真的不是一种思维方式,看着这过程化的语言难受(算是我的牢骚吧)。

发表评论

表情:
评论列表 (有 0 条评论,305人围观)

还没有评论,来说两句吧...

相关阅读

    相关 快速排序算法导论

    本算法翻译自算法导论第三版(中文版)第7章170(有兴趣的可以看看,我感觉这本书还是跟晦涩的,可能我也没多读几次的原因); 1、快速排序介绍 快速排序是一种在实际排序应用

    相关 算法导论之归并排序

    归并排序的思想就是分治法; 分治法:为了解决一个给定的问题,算法一次或多次递归地调用其自身以解决紧密相关的若干子问题。 分治模式在每层递归时都有三个步骤: 一,分解原问题