七大排序之:冒泡排序和快速排序

Posted Java开发小驿站

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了七大排序之:冒泡排序和快速排序相关的知识,希望对你有一定的参考价值。

排序是我们生活中经常会面对的问题。同学们做操时会按照从矮到高排列;老师查看上课出勤情况时,会按学生学号顺序点名;高考录取时,会按成绩总分降序依次录取等。排序是数据处理中经常使用的一种重要的运算,它在我们的程序开发中承担着非常重要的角色。

排序分为以下四类共七种排序方法:

交换排序:

  ① 冒泡排序 

  ② 快速排序

选择排序:

  ③ 直接选择排序 

  ④ 堆排序

插入排序:

  ⑤ 直接插入排序 

  ⑥ 希尔排序

合并排序:

  ⑦ 合并排序

这篇文章主要总结的是交换排序(即冒泡排序和快速排序),交换排序的基本思想是:两两比较待排序元素,如果发现两个元素的次序相反时即进行交换,直到所有元素都没有反序时为止。我会从以下几个方面进行总结:

1、冒泡排序及算法实现

2、快速排序及算法实现

3、冒泡排序VS快速排序

1、冒泡排序及算法实现

什么是冒泡排序呢?冒泡排序是一种简单的排序方法,它的基本思想是:通过相邻两个元素之间的比较和交换,使较大的元素逐渐从前面移向后面(升序),就像水底下的气泡一样逐渐向上冒泡,所以被称为“冒泡”排序。冒泡排序的最坏时间复杂度为O(n2),平均时间复杂度为O(n2)

下面以一张图来展示冒泡排序的全过程,其中方括号内为下一轮要排序的元素,方括号后面的第一个元素为本轮排序浮出来的最大元素。

1-1、示意图

1-2、代码

冒泡排序算法的代码实现:

BubbleSort.java

 
   
   
 
  1. public class BubbleSort {

  2. public static void main(String[] args) {

  3. int[] list = {36, 28, 45, 13, 67, 37, 18, 56};

  4. System.out.println("************冒泡排序************");

  5. System.out.println("排序前:");

  6. display(list);


  7. System.out.println("排序后:");

  8. bubbleSort(list);

  9. display(list);

  10. }


  11. /**

  12. * 遍历打印

  13. */

  14. public static void display(int[] list) {

  15. System.out.println("********展示开始********");

  16. if (list != null && list.length > 0) {

  17. for (int num :

  18. list) {

  19. System.out.print(num + " ");

  20. }

  21. System.out.println("");

  22. }

  23. System.out.println("********展示结束********");

  24. }


  25. /**

  26. * 冒泡排序算法

  27. */

  28. public static void bubbleSort(int[] list) {

  29. int temp;

  30. // 做多少轮排序(最多length-1轮)

  31. for (int i = 0; i < list.length - 1; i++) {

  32. // 每一轮比较多少个

  33. for (int j = 0; j < list.length - 1 - i; j++) {

  34. if (list[j] > list[j + 1]) {

  35. // 交换次序

  36. temp = list[j];

  37. list[j] = list[j + 1];

  38. list[j + 1] = temp;

  39. }

  40. }

  41. }

  42. }

  43. }

测试结果:

七大排序之:冒泡排序和快速排序

2、快速排序及算法实现 

快速排序(Quick Sort) 是对冒泡排序的一种改进方法,在冒泡排序中,进行元素的比较和交换是在相邻元素之间进行的,元素每次交换只能移动一个位置,所以比较次数和移动次数较多,效率相对较低。而在快速排序中,元素的比较和交换是从两端向中间进行的,较大的元素一轮就能够交换到后面的位置,而较小的元素一轮就能交换到前面的位置,元素每次移动的距离较远,所以比较次数和移动次数较少,速度较快,故称为“快速排序”。

快速排序的基本思想是:通过一轮排序将待排序元素分割成独立的两部分, 其中一部分的所有元素均比另一部分的所有元素小,然后分别对这两部分的元素继续进行快速排序,以此达到整个序列变成有序序列。快速排序的最坏时间复杂度为O(n2),平均时间复杂度为O(n*log2n)   

2-1、示意图

七大排序之:冒泡排序和快速排序

2-2、代码

快速排序算法的代码实现:

QuickSort.java 

 
   
   
 
  1. public class QuickSort {

  2. public static void main(String[] args) {

  3. int[] list = {6, 1, 2, 7, 9, 3, 4, 5, 10, 8};

  4. System.out.println("************快速排序************");

  5. System.out.println("排序前:");

  6. display(list);


  7. System.out.println("排序后:");

  8. quickSort(list, 0, list.length - 1);

  9. display(list);

  10. }


  11. /**

  12. * 快速排序算法

  13. */

  14. public static void quickSort(int[] list, int left, int right) {

  15. if (left < right) {

  16. // 分割数组,找到分割点

  17. int point = partition(list, left, right);


  18. // 递归调用,对左子数组进行快速排序

  19. quickSort(list, left, point - 1);

  20. // 递归调用,对右子数组进行快速排序

  21. quickSort(list, point + 1, right);

  22. }

  23. }


  24. /**

  25. * 分割数组,找到分割点

  26. */

  27. public static int partition(int[] list, int left, int right) {

  28. // 用数组的第一个元素作为基准数

  29. int first = list[left];

  30. while (left < right) {

  31. while (left < right && list[right] >= first) {

  32. right--;

  33. }

  34. // 交换

  35. swap(list, left, right);


  36. while (left < right && list[left] <= first) {

  37. left++;

  38. }

  39. // 交换

  40. swap(list, left, right);

  41. }

  42. // 返回分割点所在的位置

  43. return left;

  44. }


  45. /**

  46. * 交换数组中两个位置的元素

  47. */

  48. public static void swap(int[] list, int left, int right) {

  49. int temp;

  50. if (list != null && list.length > 0) {

  51. temp = list[left];

  52. list[left] = list[right];

  53. list[right] = temp;

  54. }

  55. }


  56. /**

  57. * 遍历打印

  58. */

  59. public static void display(int[] list) {

  60. System.out.println("********展示开始********");

  61. if (list != null && list.length > 0) {

  62. for (int num :

  63. list) {

  64. System.out.print(num + " ");

  65. }

  66. System.out.println("");

  67. }

  68. System.out.println("********展示结束********");

  69. }

  70. }

测试结果:

七大排序之:冒泡排序和快速排序

3、冒泡排序VS快速排序

代码如下:

BubbleVsQuick.java 

```java public class BubbleVsQuick {

 
   
   
 
  1. public static void main(String[] args) {

  2. testQuick();

  3. testBubble();

  4. }


  5. /**

  6. * 测试快速排序耗费的时间

  7. */

  8. public static void testQuick() {

  9. int[] list = new int[10000];

  10. for (int i = 0; i < 10000; i++) {

  11. list[i] = (int) (Math.random() * 100000);

  12. }


  13. // 快速排序

  14. long start = System.currentTimeMillis();

  15. QuickSort.quickSort(list, 0, list.length - 1);

  16. long end = System.currentTimeMillis();

  17. System.out.println("快速排序耗费的时间:" + (end - start));

  18. display(list);

  19. }


  20. /**

  21. * 测试冒泡排序耗费的时间

  22. */

  23. public static void testBubble() {

  24. int[] list = new int[10000];

  25. for (int i = 0; i < 10000; i++) {

  26. list[i] = (int) (Math.random() * 100000);

  27. }


  28. // 冒泡排序

  29. long start = System.currentTimeMillis();

  30. BubbleSort.bubbleSort(list);

  31. long end = System.currentTimeMillis();

  32. System.out.println("冒泡排序耗费的时间:" + (end - start));

  33. display(list);

  34. }


  35. /**

  36. * 遍历打印前10个数

  37. */

  38. public static void display(int[] list) {

  39. System.out.println("********排序之后的前10个数start********");

  40. if (list != null && list.length > 0) {

  41. for (int i = 0; i < 10; i++) {

  42. System.out.print(list[i] + " ");

  43. }

  44. System.out.println("");

  45. }

  46. System.out.println("********排序之后的前10个数end**********");

  47. System.out.println("");

  48. }

}

测试结果:

可见,快速排序的速度比冒泡排序更快。


个人博客:https://www.cqwxhn.xin


以上是关于七大排序之:冒泡排序和快速排序的主要内容,如果未能解决你的问题,请参考以下文章

万字手撕七大排序(代码+动图演示)

七大排序算法之冒泡排序

七大排序之冒泡排序

七大排序之冒泡排序

数据结构图解七大排序

七大排序算法之选择排序