969. 煎饼排序
题目描述
冒泡排序 思想
参考:彤哥 题解
思路:
- 类似于冒泡排序思想:每次排序时,将当前最大的元素扔到当前的末尾,即保证 [ k , n − 1 ] [k, n - 1] [k,n−1] 是当前最大值
- 当前的最大元素至多经过两次“煎饼交换”,就可以放到最终的位置
- 将当前最大元素交换到开头(i = 0)处;
- 再将这个元素从开头交换到 末尾
class Solution {
public List<Integer> pancakeSort(int[] arr) {
// 类似于冒泡,先把最大的换到最后面,再把次大的换到次后面,依次进行
int n = arr.length;
// last存储“最后一个位置”(非排好序的最后一位)
int last = n - 1;
// x 存储当前轮“最大的数”(非排好序的数中最大的)
int x = n;
List<Integer> ans = new ArrayList<>();
while (x != 1) {
// 先找到 x 的位置
int k = 0;
for ( ; arr[k] != x; k++) {}
// k == last 说明 x 已经在“最后一位”了,进入下一轮
if (k != last) {
// 把最大的数换到0号位置了,k==0 时不需要交换
if (k != 0) {
reverse(arr, 0, k);
ans.add(k + 1);
}
// 把最大的数换到“最后一位”
reverse(arr, 0, last);
ans.add(last + 1);
}
last--;
x--;
}
return ans;
}
// 双指针交换 [left, right] 中元素
private void reverse(int[] arr, int left, int right) {
while (left < right) {
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}
}