zoukankan      html  css  js  c++  java
  • 快速排序简述

    快速排序(C&Java实现)

    每天一算法,希望自己的算法能有长足的进步,加油。

    今天记录一个最常用的排序算法--快速排序,之前的两种排序算法,桶排序和冒泡排序在时间和空间上各有优势,而快速排序是这两者之间的均衡,既不浪费空间,排序的时间复杂度也比冒泡算法要低。

    接下来记录一些基本概念:

    1、快速排序

    基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

    这里假设已经读入一组长度为 n 的数组a[ ]。

    基本步骤:

        (1)、设置两个变量,排序第一次开始时:i=1, j=n;

        (2)、设置基准数等于最左边的数;

        (3)、从 j 开始向前搜索,即 j-- ,直到找到一个小于基准数的数即停下;

        (4)、从 i 开始向后搜索,即 i++,直到找到一个大于基准数的数即停下,并交换当前 a[i] 和 a[j];

        (5)、重复第 (3)、(4)步,直到 i=j,将基准数与 i 当前位置进行互换,此时数组已经分为左右两个部分,分别时左边小于基准数和右边大于基准数,分别传入数组的左 右边界进行递归调用,当进行到排序只剩基准数一个时,证明排序已经完成,退出递归。

    2、代码实现

     1)C语言实现

     1 //
     2 // Created by czc on 2019/8/16.
     3 //
     4 
     5 #include<stdio.h>
     6 int a[101],n;  //定义两个全局变量
     7 
     8 void quicksort(int left,int right) {
     9     int i, j, t, temp;
    10 
    11     if (left > right) {
    12         return;
    13     }
    14 
    15     temp = a[left];
    16     i = left;
    17     j = right;
    18 
    19     while (i != j) {
    20 
    21         //先从又往左找
    22         while (a[j] >= temp && i < j) {
    23             j--;
    24         }
    25         //再从左往又找
    26         while (a[i] <= temp && i < j) {
    27             i++;
    28         }
    29 
    30         //交换两个数在数组中的位置
    31         //当i和j没有相遇时
    32         if (i < j) {
    33             t = a[i];
    34             a[i] = a[j];
    35             a[j] = t;
    36         }
    37 
    38         //最后将基准数归位
    39         a[left] = a[i];
    40         a[i] = temp;
    41 
    42         //递归处理基准数的左右边
    43         quicksort(left, i - 1);
    44         quicksort(i + 1, right);
    45 
    46         return;
    47     }
    48 }
    49 
    50 int main(){
    51         int i;
    52 
    53         printf("请输入排序数据个数:");
    54         scanf("%d",&n);
    55 
    56         for(i=1;i<=n;i++){
    57             scanf("%d",&a[i]);
    58         }
    59 
    60         //调用快速排序
    61         quicksort(1,n);
    62 
    63         //输出排序结果
    64         for(i=1;i<=n;i++){
    65             printf("%d ",a[i]);
    66         }
    67         return 0;
    68 }

    程序输出:

       

      2)Java实现

     1  2 
     3 /*
     4 创建人:czc
     5 创建时间:2019/8/16
     6 用途:Java实现快速排序
     7  */
     8 import java.util.Scanner;
     9 
    10 import static java.lang.System.out;
    11 public class QuickSort {
    12     private static int[] book=new int[101];
    13 
    14     public static void main(String[] args){
    15         int i,n;
    16         Scanner scanner;
    17 
    18         scanner=new Scanner(System.in);
    19         out.println("请输入排序数据个数:");
    20         n=scanner.nextInt();
    21 
    22         for(i=1;i<=n;i++){
    23             book[i]=scanner.nextInt();
    24 
    25         }
    26 
    27         quicksort(1,n);
    28 
    29         //输出排序结果
    30         for(i=0;i<=n;i++){
    31             out.print(book[i]+" ");
    32         }
    33 
    34     }
    35 
    36     private static void quicksort(int left,int right){
    37         int i,j,t,temp;
    38 
    39         if(left>right){
    40             return;
    41         }
    42 
    43         temp=book[left];
    44         i=left;
    45         j=right;
    46 
    47         while(i!=j){
    48 
    49             //先从右往左找
    50             while(book[j]>=temp&&i<j){
    51                 j--;
    52             }
    53             //再从左往右找
    54             while(book[i]<=temp&&i<j){
    55                 i++;
    56             }
    57 
    58             //交换两个数在数组中的位置
    59             //当i和j没有相遇时
    60             if(i<j){
    61                 t=book[i];
    62                 book[i]=book[j];
    63                 book[j]=t;
    64             }
    65 
    66         }
    67 
    68         //最后将基准数归位
    69         book[left]=book[i];
    70         book[i]=temp;
    71 
    72         quicksort(left,i-1);
    73         quicksort(i+1,right);
    74     }
    75 
    76 }

    程序输出:

    吾生也有涯,而知也无涯。

  • 相关阅读:
    整数数组的组合问题
    C++ 虚函数与纯虚函数 浅析
    NetBeans 8.0 连接远程服务器
    R语言画图教程之盒形图
    R语言建立回归分析,并利用VIF查看共线性问题的例子
    R语言建立回归分析,并利用VIF查看共线性问题的例子
    Python技巧—list与字符串互相转换
    Python技巧—list与字符串互相转换
    sas正则式之prxparen
    sas正则式之prxparen
  • 原文地址:https://www.cnblogs.com/hzauxx/p/11364050.html
Copyright © 2011-2022 走看看