快速排序简述

快速排序(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 }

 

 

程序输出:

 

 

 

 

 

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

 

转载于:https://www.cnblogs.com/hzauxx/p/11364050.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值