快速排序简述
快速排序(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 }
程序输出:
吾生也有涯,而知也无涯。