连续自然数打乱交换排序 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     }

 

posted @ 2017-04-24 11:50  walle搬砖  阅读(226)  评论(0编辑  收藏  举报