你的位置:首页 > Java教程

[Java教程]必须知道的八大种排序算法【java实现】(一) 冒泡排序、快速排序


冒泡排序

  冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

  冒泡排序的示例

 

冒泡排序的算法实现如下:【排序后,数组从小到大排列】

   /**   * 冒泡排序   * 比较相邻的元素。如果第一个比第二个大,就交换他们两个。    * 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。    * 针对所有的元素重复以上的步骤,除了最后一个。   * 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。   * @param numbers 需要排序的整型数组   */  public   static void bubbleSort(int[] numbers)  {    int temp; //记录临时中间值    int size = numbers.length; //数组大小    for(int i = 0 ; i < size - 1 ; i++)    {    for(int j = i + 1 ; j < size ; j ++)    {      if(numbers[i] > numbers[j]) //交换两数位置      {      temp = numbers[i];      numbers[i] = numbers[j];      numbers[j] = temp;      }    }    }  }

 


 

快速排序

快速排序的基本思想

         通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对这两部分继续进行排序,直到整个序列有序。

快速排序的示例

(a)一趟排序的过程:

(b)排序的全过程

  把整个序列看做一个数组,把第零个位置看做中轴,和最后一个比,如果比它小交换,比它大不做任何处理;交换了以后再和小的那端比,比它小不交换,比他大交换。这样循环往复,一趟排序完成,左边就是比中轴小的,右边就是比中轴大的,然后再用分治法,分别对这两个独立的数组进行排序。

 

代码实现如下:

1.查找中轴(最低位作为中轴)所在位置

   /**   * 查找出中轴(默认是最低位low)的在numbers数组排序后所在位置   *   * @param numbers 带查找数组   * @param low  开始位置   * @param high 结束位置   * @return 中轴所在位置   */  public static int getMiddle(int[] numbers, int low,int high)  {    int temp = numbers[low]; //数组的第一个作为中轴    while(low < high)    {    while(low < high && numbers[high] > temp)    {      high--;    }    numbers[low] = numbers[high];//比中轴小的记录移到低端    while(low < high && numbers[low] < temp)    {      low++;    }    numbers[high] = numbers[low] ; //比中轴大的记录移到高端    }    numbers[low] = temp ; //中轴记录到尾    return low ; // 返回中轴的位置  }

 

2、 递归形式的分治排序算法:

   /**   *   * @param numbers 带排序数组   * @param low 开始位置   * @param high 结束位置   */  public static void quickSort(int[] numbers,int low,int high)  {    if(low < high)    {      int middle = getMiddle(numbers,low,high); //将numbers数组进行一分为二      quickSort(numbers, low, middle-1);  //对低字段表进行递归排序      quickSort(numbers, middle+1, high); //对高字段表进行递归排序    }    }

 

3、快速排序提供方法调用

   /**   * 快速排序   * @param numbers 带排序数组   */  public static void quick(int[] numbers)  {    if(numbers.length > 0)  //查看数组是否为空    {    quickSort(numbers, 0, numbers.length-1);    }  }

 


 

 方法测试

打印函数:

  public static void printArr(int[] numbers)  {    for(int i = 0 ; i < numbers.length ; i ++ )    {    System.out.print(numbers[i] + ",");    }    System.out.println("");  }

 

测试:

  public static void main(String[] args)   {    int[] numbers = {10,20,15,0,6,7,2,1,-5,55};    System.out.print("排序前:");    printArr(numbers);        bubbleSort(numbers);    System.out.print("冒泡排序后:");    printArr(numbers);            quick(numbers);    System.out.print("快速排序后:");    printArr(numbers);  }

 

结果:

排序前:10,20,15,0,6,7,2,1,-5,55,冒泡排序后:-5,0,1,2,6,7,10,15,20,55,快速排序后:-5,0,1,2,6,7,10,15,20,55,

 

   

  致谢:感谢您的耐心阅读!