连续自然数打乱交换排序 o(n)复杂度
题目: 1-n之间的连续自然,被打乱了顺序,要求只用元素交换来恢复[1-n]这个序列,时间复杂o(n);
我们知道只要涉及到元素比较的排序,其时间复杂度底线是nlogn,乍一看这个题目都会从联想到排序,其实根本不涉及到排序。这个题目给了两个核心提示:
a: 连续
b: 交换
代码实现如下:
1 public void sortShuffledSequence() { 2 int[] arr = {2,4,1,6,5,8,9,3,10,7}; 3 for (int i = 0; i < arr.length; ++i) { 4 while ((i + 1) != arr[i]) { 5 swap(arr, i, arr[i] - 1); 6 } 7 } 8 System.out.println(arr); 9 } 10 11 private void swap(int [] arr, int i, int j) { 12 int tmp = arr[i]; 13 arr[i] = arr[j]; 14 arr[j] = tmp; 15 System.out.println("i, j " + arr[i] + " " + arr[j]); 16 }