题目:长度为N的数组乱序存放着0到N-1.现在只能进行0与其他数的 swap 操作,请设计并实现排序,必须通过交换实现排序。
如: 给定:{ 6, 5, 7, 0, 4, 9, 3, 1, 2, 8 }
返回: { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }
算法思路: 由题目可以得出两条信息:(1)数组的下标和值是一一对应的;(2)读取一个数组元素时,如果数组元素值和下标值不等,那么就把这个数组元素值放到正确位置上,目标位置的元素值放回来,但是只能进行0与其他数的swap操作,因此一次操作需要两次与 0 的交换操作;判断数组中的最后一个元素值与其下标值是否相等,若不等则将位置 0 上的数组元素值交换到与之相对应的数组下标指处,当然这个交换需要借助 0;
代码如下:
public class SwapSorted {
public static void main(String[] args) {
int[] arr = { 6, 5, 7, 0, 4, 9, 3, 1, 2, 8 };
int len = arr.length;
System.out.print("排序前的数组:");
print(arr);
sortArr(arr, len);
System.out.print("排序后的数组:");
print(arr);
}
/**
* 对数组进行排序
*
* @param arr
* @param len
*/
public static void sortArr(int[] arr, int len) {
if (arr == null || len < 1)
return; // 直接返回
for (int i = len - 1; i > 0; i--) {
if (i == arr[i])
continue; // 如果数组最大位置上的元素值与其下标值相等,则跳出本次循环
swapNum(arr, arr[i]); // 否则交换数组元素0和下标值最大处的元素值
int maxNum = arr[i];
for (int j = i; j >= 0; j--) {
if (arr[j] > maxNum) {
maxNum = arr[j]; // 找出最大值
}
}
swapNum(arr, maxNum); // 交换数组元素0和当前的最大值。使得当前最大值放置到正确的位置
}
}
/**
* 交换数组元素0和当前的数值元素num
*
* @param arr
* @param num
*/
public static void swapNum(int[] arr, int num) {
int zeroIndex = -1;
int numIndex = -1;
for (int i = 0; i < arr.length; i++) {
if (0 == arr[i]) {
zeroIndex = i;
}
if (num == arr[i]) {
numIndex = i;
}
}
int temp = arr[zeroIndex];
arr[zeroIndex] = arr[numIndex];
arr[numIndex] = temp;
}
/**
* 打印输出数组元素
*
* @param arr
*/
public static void print(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
}
程序运行如下: