• 快速排序的Java和python实现,亲测实际可用


    1.基本思想

      快速排序每趟排序确定一个元素x的位置,使用的方式是 将大于元素x的值放大x的右边,小于元素x的值放大x的左边。当确定x的位置之后,再分别对x左边的数组和右边的数组进行快速排序即可。

    2.算法实现

      这里我使用的是递归的方法。

      假设先取数组第一个元素为x,同时设i,j分别指向数组头部和数组尾部,即i=0,j=length(arr)-1;因为x取得第一个元素,所以最开始i所指向的位置即x的位置。

      先从尾部j指向的元素开始比较,只要j指向的元素大于x,j便向前移一位;一旦j指向的元素小于x,就将j指向的元素放在当前x所在的位置(即当前i指向的位置),此时可以当做x目前处于j所指向的位置。然后将x与i所指向的元素进行比较,只要i指向的元素小于x,i便向后移动一位;一旦i指向的元素大于x,就将i指向的元素放在当前x所在的位置(即当前j所指向的位置),此时可以将x的位置认为是i指向的位置。不断循环,直到  i>=j。此时便找到了x最终的位置,即此时i,j所共同指向的位置。再将x的值填到这个位置当中,便完成了一趟快速排序。

    java的代码实现如下:因为初学java,这里使用方法的时候踩了几个坑,发现静态方法中不能调用非静态成员,后来把sort改为非静态方法

     1 public class QuickSort {
     2     public static void main(String args[]) {
     3         int arr[] = {6,2,10,3,8,9};
     4         QuickSort sorter = new QuickSort();
     5         int m = 0, n = arr.length - 1;
     6         sorter.sort(arr, m, n);
     7     }
     8     
     9     
    10     public void sort(int arr[], int m, int n) {
    11         if(m < n) {
    12             int x = arr[m];//每次确定位置的数组元素
    13             int i = m, j = n;
    14             while(i < j) {//快速排序的核心,将大于x的值全放大x的右边,小于的全放在左边
    15                 while(i < j && x < arr[j]) {
    16                     j--;
    17                 }
    18                 if(x > arr[j]) {//如果j指向的数小于x,则放到x左边;if条件以防止循环因i>=j终止
    19                     arr[i] = arr[j];
    20                 }
    21                 while(i < j && x > arr[i]) {
    22                     i++;
    23                 }
    24                 if(x < arr[i]) {//如果i指向的数大于x,则放大x右边
    25                     arr[j] = arr[i];
    26                 }
    27             }
    28             arr[i] = x;
    29             showArray(arr);
    30             sort(arr, m, i-1);//对左边的部分进行快速排序
    31             sort(arr, i+1, n);//对右边的部分进行快速排序
    32         }
    33     }
    34     
    35     public void showArray(int arr[]) {
    36         for(int x:arr){
    37             System.out.print(x+"、");
    38         }
    39         System.out.println("");
    40     }
    41 }

    python 的代码实现如下

     1 # -*- coding: utf-8 -*-
     2 
     3 def QuickSort(lista, m, n):
     4     if m < n:
     5         i = m
     6         j = n
     7         x = lista[i]
     8         while i < j:#第一趟排序
     9             while i < j and x < lista[j]:
    10                 j = j - 1
    11             if x > lista[j]:
    12                 lista[i] = lista[j]
    13             while i < j and x > lista[i]:
    14                 i = i + 1
    15             if  x < lista[i]:
    16                 lista[j] = lista[i]
    17         lista[i] = x#确定x位置后,将x放入该位置
    18         print(lista)
    19         QuickSort(lista, m, i - 1)#递归处理左边部分
    20         QuickSort(lista, i + 1, n)#递归处理右边部分
    21         return lista
    22 
    23 
    24 if __name__ == '__main__':
    25     listx = [6,2,10,3,8,9]
    26     a = 0
    27     b = len(listx) - 1
    28     listb = QuickSort(listx, a, b)
    29     print(listb)

    最后其实发现,每趟排序中的j--,i++部分的循环体均可以使用if语句来达到目的,但是在网上看到的博客大家都是使用循环,如果有知道的朋友欢迎给我解答

  • 相关阅读:
    淘宝破裤子奇遇记--记酷锐哲型旗舰店
    第9章 在实践中使用模板:9.5 后记
    第9章 在实践中使用模板:9.4 破译大篇幅错误信息
    第9章 在实践中使用模板:9.3 预编译头文件
    第9章 在实践中使用模板:9.2 模板和内联
    第9章 在实践中使用模板:9.1 包含模型
    第8章 编译期编程:8.5 编译期if
    第8章 编译期编程:8.4 SFINAE(替换失败并不是错误)
    第8章 编译期编程:8.3 偏特化的执行路径选择
    第8章 编译期编程:8.2 使用constexpr计算
  • 原文地址:https://www.cnblogs.com/xiang9286/p/9650083.html
Copyright © 2020-2023  润新知