交换排序

      交换排序包括冒泡排序快速排序

  冒泡排序

  • 基本思想

  将序列中第一个元素与第二个元素进行比较,如果前者大于后者,则两个元素交换位置,否则不交换;再将第二个元素与第三个元素比较,按照之前处理方式,依次类推。经过这样一趟排序,使得n个元素中最大的元素被放到最后一个位置。之所以叫冒泡排序,就是因为每次比较都会把较小的元素往前移,所以就慢慢的冒出来。

  • 复杂度分析

  冒泡排序的外层for循环次数为n-1,内层for循环的循环次数为i,克制内层的比较次数为n(n-1)/2=O(n2)。所以,冒泡排序最好、最坏、平均情况下的时间复杂度是相同的。

  • 代码实现
 1 public int[] sort2(int[] array) {
 2         // 冒泡排序
 3         for (int i = 0; i < array.length; i++) {
 4             for (int j = 0; j < array.length - 1 - i; j++) {
 5                 if (array[j] > array[j + 1]) {
 6                     int tmp = array[j];
 7                     array[j] = array[j + 1];
 8                     array[j + 1] = tmp;
 9                 }
10             }
11         }
12         return array;
13     }

 

 

  快速排序

  • 基本思想

  快速排序平均时间性能最快。任选序列中的一个记录(通常选第一个记录)作为枢轴,以它的关键字和数组中其他的记录进行比较,将所有关键字比它小的记录都排在它的前面,将所有关键字比它大的记录都排在它之后。经过一趟排序后,按此记录所在位置为界,将序列划分为两个部分,再对着两个部分重复上述的操作,直至每一个部分中只剩一个记录为止。

  • 复杂度分析

  快速排序被公认为所有同数量级O(nlogn)的排序中平均性能是最好的,其时间复杂度是O(n2)

  • 代码实现

 

 1 public void sort4(int[] array, int left, int right) {
 2         // 递归实现快排
 3         if (left < right) {
 4             int tmp = array[left];
 5             int i = left, j = right;
 6             while (i < j) {
 7                 while (i < j && array[j] >= tmp) j--;
 8                 array[i] = array[j];
 9                 while (i < j && array[i] <= tmp) i++;
10                 array[j] = array[i];
11             }
12             array[i] = tmp;
13             sort4(array, left, i - 1);
14             sort4(array, i + 1, right);
15         }
16     }

 

posted @ 2019-06-01 00:24  wtwexile  阅读(347)  评论(0编辑  收藏  举报