• 排序之交换排序:冒泡排序+快速排序


    一、冒泡排序

    1、思想:从头部开始,两两比较,根据大小交换位置,直到将最大(小)元素放到尾部,对未排序的元素重复此过程。

    2、时间复杂度:无论初始序列如何都需多遍扫描

    最好:O(N)(带交换旗帜),正序情况,只有比较时间,无移动时间

    最坏:O(N2),逆序情况

    平均:O(N2)

    3、辅助空间:O(1)

    4、稳定性:稳定

    5、适用场合:适合n小的场合

     1 import java.util.*;
     2 
     3 //冒泡排序
     4 public class BubbleSort {
     5     private static Scanner cin;
     6     public static void swap(int a[],int i,int j) {
     7         int temp;//辅助空间O(1)
     8         temp = a[i];
     9         a[i] = a[j];
    10         a[j] = temp;
    11     }
    12     public static void bubbleSort(int[] a) {//从小到大 
    13         //两两交换
    14         int i,j,flag = 1;//flag为交换旗帜
    15         //共n-1趟,除去剩余一个元素(在剩余两个元素时已排号序)
    16         for(i = 0;i < a.length-1;i++) {
    17             for(j = 0;j<a.length-1-i;j++) {
    18                 if(a[j]>a[j+1]) {//变成>=就不稳定,从大到小只需变成<
    19                     swap(a,j,j+1);//相邻交换
    20                     flag = 0;
    21                 }
    22             }
    23             if(flag == 1) break;//当已排好序则可以跳出  
    24         }    
    25     }
    26     public static  void main(String[] args) {
    27         int[] a = new int[5];
    28         cin = new Scanner(System.in);
    29         int i=0;
    30         while(i<a.length) {
    31             a[i] =cin.nextInt();
    32             i++;
    33         }
    34         bubbleSort(a);    
    35         for(i = 0;i < a.length;i++) {
    36             System.out.println(a[i]);
    37         }
    38     }
    39 }

    二、快速排序(递归版)

    1、思想:对冒泡的改进,采用分治思想,每次将待排元素划分成两部分,通过多次划分过程(过程中变有序即轴点归位),使整个序列变得有序

    2、时间复杂度

    最好:O(nlogn),每次划分都比较平均,轴点接近中央

    最坏:O(N2),每次轴点都是最大或最小,导致只划分一个区

    平均:O(nlogn)

    3、辅助空间:最好情况为O(logn),最坏为O(N),主要用于递归栈。

    4、稳定性:不稳定,交换过程导致

    5、适用场合:n较大时

     1 import java.util.Scanner;
     2 
     3 public class QuickSort {
     4     
     5     //找到轴点位置
     6     public static int partition(int[] a,int low,int high) {
     7         int pivotkey = a[low],pivot;
     8         while(low < high) {//相遇停止,交换过程导致不稳定
     9             //从后往前找到比轴点小的数放到前段
    10             while(low < high && a[high] >= pivotkey) --high;
    11             a[low] = a[high];
    12             //从前往后找到比轴点值大的数放到后段
    13             while(low < high && a[low] <= pivotkey) ++low;
    14             a[high] = a[low];
    15         }
    16         pivot = low;//记录轴点位置,low = high且为空位
    17         a[pivot] = pivotkey;//将轴点值放到正确的位置上
    18         return pivot;
    19     }
    20     
    21     public static void quickSort(int[] a,int low,int high) {
    22         int pivot;
    23         if(low < high) {
    24             pivot = partition(a,low,high);
    25             quickSort(a, low, pivot-1);//轴点左段
    26             quickSort(a, pivot+1, high);//轴点右段
    27         }
    28     }
    29 
    30     public static void main(String[] args) {
    31         int[] a = new int[10];
    32         Scanner cin = new Scanner(System.in);
    33         int i=0;
    34         while(i<a.length) {
    35             a[i] =cin.nextInt();
    36             i++;
    37         }
    38         quickSort(a,0,a.length-1);    
    39         for(i = 0;i < a.length;i++) {
    40             System.out.print(a[i]+" ");
    41         }
    42 
    43     }
    44 
    45 }

     三、对比

    快速排序之所比较快,因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。

  • 相关阅读:
    成功解决vc6.0智能提示消失的BUG
    如何在vc6,vc7,vc8下编译x264
    Visual C++ 操作MS Offfice 控件
    在英文版Visual Studion 2005 professional 中使用 Windows Mobile 2003 SE中文模拟器
    x264 20060731 svn 版的编码移植
    泛型算法:Tips
    05年度EmilMatthew’s Blog文档整理
    常用软件滤波方法及其示例程序
    windows server 2003 配置
    TI C64X 视频处理应用编程重点内容提示
  • 原文地址:https://www.cnblogs.com/lizijiangmm/p/8644680.html
Copyright © 2020-2023  润新知