快速排序,选择排序,冒泡排序

三种排序算法是在数组排序中用到比较多的,下面来具体说明各种排序方法以及区别

 快速排序法

使用快速排序方法对a[n]排序
从a[n]中选择一个元素作为基准,一般选a[0],设定low指向a[0](队首),high指向a[n-1](队尾),
先从队尾开始向前扫描,若a[high]>a[0],则high--,否则将a[high]赋值给a[low],即a[low]=a[high]
然后从队首开始向前扫描,若a[low]<a[0],则low++,否则a[high]=a[low]
这样,会将所有小于基准数a[0]的元素放到a[0]左边,把大于a[0]的元素都放到a[0]右边
再使用递归分别对左边、右边的子数组进行排序,最终完成排序

 1 //快速排序算法(快速排序可参考:https://blog.csdn.net/nrsc272420199/article/details/82587933
 1 void Quick_Sort(int arr[], int begin, int end){
 2     //tmp是作为比较的基数
 3     if(begin > end) return;
 4     int tmp = arr[begin];
 5     int i = begin;
 6     int j = end;
 7     while(i != j){
 8         // 当队尾的元素大于等于基准数据时,向前挪动j索引
 9         while(i < j && arr[j] >= tmp){
10             j--;
11         }
12         // 当队首的元素大于等于基准数据时,向后挪动i索引
13         while(i < j && arr[i] <= tmp){
14             i++;
15         }
16         //此时是arr[i] > tmp, arr[j] < tmp,交换arr[i]和arr[j]
17         if(i < j){
18             int t = arr[i];
19             arr[i] = arr[j];
20             arr[j] = t;
21         }
22     }
23     //当一轮循环过后,i = j , 此时的i和j就是tmp的正确索引位置
24     arr[begin] = arr[i];
25     arr[i] = tmp; // 交换基数到正确索引位置
26 
27     // 递归调用,按照上述方法流程继续对index位置两端的子数组进行排序
28     Quick_Sort(arr, begin, i-1);
29     Quick_Sort(arr, i+1, end);
30 }

32 //冒泡排序,小到大。(如果是从大到小,就要对数组从后往前进行冒泡遍历)
33 @Test
34 public void bubbleSort(){
35     Scanner sc = new Scanner(System.in);
36     int temp, arr[];
37     while(sc.hasNext()){//可循环进行测试
38         //输入数组长度和数组,比如:输入5回车后,再输入 1 3 4 2 6
39         int n = sc.nextInt();
40         arr = new int[n];
41         for(int i =0;i<n;i++){
42             arr[i] = sc.nextInt();
43         }
44         //数组中相临两数比较,前面的大于后者就交换位置
45         //冒泡排序:每一轮将依次出现一个最大数(最右边),次大数...
46         for(int i=0;i<n-1;i++){
47             for(int j=0;j<n-1-i;j++){
48                 if(arr[j] > arr[j+1]){
49                     temp = arr[j];
50                     arr[j] = arr[j+1];
51                     arr[j+1] = temp;
52                 }
53             }                
54         }
55         //排序后
56         for(int i=0;i<n;i++){
57             System.out.print(arr[i]+" ");
58         }
59     }
60 }
61 
62 //选择排序,小到大
63 @Test
64 public void selectSort(){
65     Scanner sc = new Scanner(System.in);
66     int temp, arr[];
67     while(sc.hasNext()){//可循环进行测试
68         int n = sc.nextInt();                
69         arr = new int[n];
70         for(int i =0;i<n;i++){
71             arr[i] = sc.nextInt();
72         }
73         //数组中每个数依次与它后面的数进行比较,若前者大于后者,交换二者位置
74         for(int i=0;i<n-1;i++){
75             for(int j=i+1;j<n;j++){
76                 if(arr[i]>arr[j]){
77                     temp = arr[i];
78                     arr[i] = arr[j];
79                     arr[j] = temp;
80                 }
81             }                
82         }
83         //排序后
84         for(int i=0;i<n;i++){
85             System.out.print(arr[i]+" ");
86         }
87     }
88 }

另外,冒泡排序和选择排序相似,时间复杂度也相同。

下面是各种排序算法的复杂度比较:

以上就是三种排序法的介绍,如有不足还请指出。

posted @ 2019-12-14 12:39  为青春而搏  阅读(259)  评论(0编辑  收藏  举报