交换排序包括冒泡排序和快速排序
冒泡排序
- 基本思想
将序列中第一个元素与第二个元素进行比较,如果前者大于后者,则两个元素交换位置,否则不交换;再将第二个元素与第三个元素比较,按照之前处理方式,依次类推。经过这样一趟排序,使得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 }