• 快速排序的实现


    Java

    快速排序也是一种交换排序。首先选定一个基准元素(一般取第一个或最后一个元素),根据基准元素,将序列分为2个子序列,左边子序列的全部元素都小于等于基准元素,右边序列的全部元素都大于等于该基准元素。然后对左右这两个序列,递归重复上面的算法,直到序列排序完成。

    快速排序的时间复杂度期望是 $O(nlogn)$,最慢可达到 $O(n^2)$。一般在一个乱序的大列表中,快速排序还是最快的排序算法。

    以下是java代码简单实现:

     1 import java.util.Arrays;
     2 
     3 public class QuickSort {
     4 
     5     public void sort(int[] input) {
     6         quickSort(input, 0, input.length-1);
     7     }
     8 
     9     private void quickSort(int[] input, int low, int high) {
    10         if (low < high) {
    11             int middle = this.getMiddle_swap(input, low, high);
    12             this.quickSort(input, low, middle-1);
    13             this.quickSort(input, middle+1, high);
    14         }
    15     }
    16 
    17     private int getMiddle_swap(int[] input, int low, int high) {
    18         int tmp = input[low]; // 取一个基准元素
    19 
    20         while (low < high) {
    21             while (low < high && input[high] >= tmp) {
    22                 high--;
    23             }
    24 
    25             input[low] = input[high];
    26 
    27             while (low < high && input[low] <= tmp) {
    28                 low++;
    29             }
    30 
    31             input[high] = input[low];
    32         }
    33 
    34         input[low] = tmp;
    35         return low;
    36     }
    37 
    38     public static void main(String[] args) {
    39         int a[]={5,4,4,5,62,99,98,54,56,17,18,23,34,15,35,25,53,51};
    40         new QuickSort().sort(a);
    41         System.out.println(Arrays.toString(a));
    42     }
    43 }

     C实现

     

     

    #include<bits/stdc++.h>
    using namespace std;
    
    const int maxn = 1e5 + 10;
    int a[maxn], n;
    int split(int low, int high)
    {
        int i = low;
        int x = a[low]; // 额外的空间,O(1)
        for(int j = low+1;j <= high;j++)
        {
            if(a[j] <= x)
            {
                i++;
                if(i != j) swap(a[i], a[j]);
            }
        }
        swap(a[low], a[i]);
        return i;
    }
    
    void quickSort(int low, int high)
    {
        if(low < high)
        {
            int pos = split(low, high);
            quickSort(low, pos-1);
            quickSort(pos+1, high);
        }
    }
    
    int main()
    {
        scanf("%d
    ", &n);
        for(int i = 1;i <= n;i++)
            scanf("%d", &a[i]);
    
        quickSort(0, n);
        for(int i = 1;i <= n;i++)  printf("%d ", a[i]);
    }

    参考链接:

    1. https://buzheng.org/quick-sort.html

    2. 《算法设计技巧与分析》

  • 相关阅读:
    最快效率求出乱序数组中第k小的数
    调整数组顺序使奇数位于偶数前面
    分治算法的完美使用----归并排序
    快速排序分区以及优化方法
    分治法以及快速排序
    高效求a的n次幂的算法
    最长连续递增子序列(部分有序)
    在有空字符串的有序字符串数组中查找
    旋转数组的最小数字(改造二分法)
    递归----小白上楼梯
  • 原文地址:https://www.cnblogs.com/lfri/p/10731923.html
Copyright © 2020-2023  润新知