实现int数组排序,内容(0~n-1),存在一固定方法swap();功能为传入目标值与值0交换

题目: int数组排序 int[] array;

条件:

  1.存在int类型数组,{0~n-1}, 形如:{3,1,0,..,n-1};

  2.存在一固定不可修改方法swapMethod(array[], len, n); 功能:目标'值n'与'值0'进行交换(不是索引)

  3.实现sortMethod();实现数组排序;

以下为个人实现方式;  目前只知其然而不知其所以然, 期待各位大佬指点一二, 不胜感激!

实现一:

public class SortTest {

    public static void main(String[] args) {
        int[] array = {0, 1, 6, 3, 5, 2, 4, 10, 9, 8, 7};
        sortMethod(array);
        System.out.println(Arrays.toString(array));
    }

    /**
     * 数组排序
     * @param array int数组
     */
    private static void sortMethod(int[] array) {
        for (int i = 0; i < array.length; i++) {
            if (array[i] == i) {
                continue;
            }
            swapMethod(array, array.length, array[i]); //移动
            swapMethod(array, array.length, i);
        }
    }

    /**
     * !!!不可修改方法功能(只能传入值n与0交换),(该实现方式很挫..可自行.
     * 将目标值n与数组值0进行交换;(两个值都不是索引,指的是数组实际值)
     * @param array 数组
     * @param len 数组length
     * @param n 目标值n
     */
    public static void swapMethod(int[] array, int len, int n) {
        // 以下两处找索引的步骤应有更好的方式
        int index1 = 0;
        for (int i = 0; i < len; i++) {
            if (array[i] == 0) { // 找出值0的索引
                index1 = i;
                break;
            }
        }

        int index2 = 0;
        for (int i = 0; i < len; i++) {
            if (array[i] == n) { // 找出值n的索引
                index2 = i;
                break;
            }
        }

        int tmp = array[index1];
        array[index1] = array[index2];
        array[index2] = tmp;
    }
}

实现方式二: 变种实现, (跟除零的其他值交换)

public class SortTest2 {

    private static int swapVal = 3;

    public static void main(String[] args) {
        // 此处数组的"最小值"必须为swapVal(3);
        // 因为以最小值作为"交换位"或"缓冲位" ->才能排序, (另:理论上以最大值应该也可以,sortMethod相应修改)
        int[] array = {6, 3, 5, 4, 10, 9, 8, 7};
        sortMethod(array);
        System.out.println(Arrays.toString(array));
    }

    /**
     * 数组排序
     * @param array int数组
     */
    private static void sortMethod(int[] array) {
        int currRealVal;
        for (int i = 0; i < array.length; i++) {
            // 当前值 == i + swapVal;
            currRealVal = i + swapVal;
            if (array[i] == currRealVal) {
                continue;
            }
            swapMethod(array, array.length, array[i]);
            swapMethod(array, array.length, currRealVal);
        }
    }

    /**
     * !!!不可修改方法功能(只能传入值n与0交换),(该实现方式很挫..可自行.
     * 将目标值n与数组值0进行交换;(两个值都不是索引,指的是数组实际值)
     * @param array 数组
     * @param len 数组length
     * @param n 目标值n
     */
    public static void swapMethod(int[] array, int len, int n) {
        // 以下两处找索引的步骤应有更好的方式
        int swapIndex = 0;
        for (int i = 0; i < len; i++) {
            if (array[i] == swapVal) { // 找出交换值swapVal的索引
                swapIndex = i;
                break;
            }
        }

        int index2 = 0;
        for (int i = 0; i < len; i++) {
            if (array[i] == n) { // 找出值n的索引
                index2 = i;
                break;
            }
        }

        int tmp = array[swapIndex];
        array[swapIndex] = array[index2];
        array[index2] = tmp;

        /*array[swapIndex] = array[swapIndex] ^ array[index2];
        array[index2] = array[swapIndex] ^ array[index2];
        array[swapIndex] = array[swapIndex] ^ array[index2];*/
    }
}

期待大佬指点一二, 这到底是何原理, 依据什么理论??

好的,这是一个关于排序和二分查找的问题。 首先,我们需要对待查找的数据进行排序,这里就采用一种简单的排序算法——冒泡排序。冒泡排序的基本思想是:从第一个元素开始,比较相邻的两个元素大小,如果前一个元素大于后一个元素,则交换它们的位置,依次比较下去,直到最后一个元素。 接下来,我们可以用二分查找来查找指定的元素。二分查找的基本思想是:将待查找的区间分成两个部分,取中间位置的元素与目标元素进行比较,如果相等,则找到了目标元素;如果目标元素大于中间元素,则在后半部分继续查找;如果目标元素小于中间元素,则在前半部分继续查找。 下面是示例代码: ```c++ #define MAXSIZE 100 typedef struct LNode{ int Data[MAXSIZE]; int Length; }List; void Swap(int& a, int& b){ int temp = a; a = b; b = temp; } void Sort(List& L){ for(int i = 0; i < L.Length-1; i++){ for(int j = 0; j < L.Length-i-1; j++){ if(L.Data[j] > L.Data[j+1]){ Swap(L.Data[j], L.Data[j+1]); } } } } int BinarySearch(List L, int X){ int left = 0, right = L.Length - 1; while(left <= right){ int mid = (left + right) / 2; if(L.Data[mid] == X){ return mid; } else if(L.Data[mid] < X){ left = mid + 1; } else{ right = mid - 1; } } return -1; } ``` 在这个示例代码中,我们先用冒泡排序将待查找的数组进行排序,然后调用二分查找函数查找目标元素 X,最终返回了它的索引位置。需要注意的是,我们传递参数时,为了避免修改原数据,我们使用了值传递的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值