数据结构——交换排序(冒泡排序,快速排序java)

一.冒泡排序

1.原理:比较两个相邻的元素,将值大的元素交换至右端。

依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复第一趟步骤,直至全部排序完成。

2.时间复杂度

1.如果我们的数据正序,只需要走一趟即可完成排序。所需的比较次数C和记录移动次数M均达到最小值,即:Cmin=n-1;Mmin=0;所以,冒泡排序最好的时间复杂度为O(n)。

  2.如果很不幸我们的数据是反序的,则需要进行n-1趟排序。每趟排序要进行n-i次比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:冒泡排序的最坏时间复杂度为:O(n2) 。

综上所述:冒泡排序总的平均时间复杂度为:O(n2) 。

3.代码实现:

复制代码
/*
 * 冒泡排序
 */
public class BubbleSort {
  public static void main(String[] args) {
    int[] arr={6,3,8,2,9,1};
    System.out.println("排序前数组为:");
    for(int num:arr){
      System.out.print(num+" ");
    }
    for(int i=0;i<arr.length-1;i++){//外层循环控制排序趟数
      for(int j=0;j<arr.length-1-i;j++){//内层循环控制每一趟排序多少次
        if(arr[j]>arr[j+1]){
          int temp=arr[j];
          arr[j]=arr[j+1];
          arr[j+1]=temp;
        }
      }
    } 
    System.out.println();
    System.out.println("排序后的数组为:");
     for(int num:arr){
       System.out.print(num+" ");
     } 
  }
 }

二.快速排序

1.原理

选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。

2.图解

3.代码实现

public class quickSort {
 
  inta[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};
 
public quickSort(){
 
    quick(a);
 
    for(int i=0;i<a.length;i++)
 
       System.out.println(a[i]);
 
}
 
public int getMiddle(int[] list, int low, int high) {   
 
            int tmp = list[low];    //数组的第一个作为中轴   
 
            while (low < high) {   
 
                while (low < high && list[high] >= tmp) {   
 
                    high--;   
 
                }   
 
                list[low] = list[high];   //比中轴小的记录移到低端   
 
                while (low < high && list[low] <= tmp) {   
 
                    low++;   
 
                }   
 
                list[high] = list[low];   //比中轴大的记录移到高端   
 
            }   
 
           list[low] = tmp;              //中轴记录到尾   
 
            return low;                   //返回中轴的位置   
 
        }  
 
public void _quickSort(int[] list, int low, int high) {   
 
            if (low < high) {   
 
               int middle = getMiddle(list, low, high);  //将list数组进行一分为二   
 
                _quickSort(list, low, middle - 1);        //对低字表进行递归排序   
 
               _quickSort(list, middle + 1, high);       //对高字表进行递归排序   
 
            }   
 
        } 
 
public void quick(int[] a2) {   
 
            if (a2.length > 0) {    //查看数组是否为空   
 
                _quickSort(a2, 0, a2.length - 1);   
 
        }   
 
       } 
 
}

猜你喜欢

转载自blog.csdn.net/wind_cp/article/details/82927478