0交换排序 java_编程练习-只用0交换排序数组

博客内容描述了如何使用0交换策略对一个包含0到n-1的乱序数组进行排序。通过移动0到数组首位,然后依次利用0与其他元素交换,将每个元素放到其应有的位置,从而实现排序。文章提供了详细的Java实现代码示例。
摘要由CSDN通过智能技术生成

题目来源:华为模拟题

题目描述

华为模拟测试题,蛮简单,一个长度为n的整型数组,乱序存放0至n-1,要求只能交换0和其中的一个数,对数组进行排序(也没有说升序还是降序),交换的函数他已经写好了。给出如下结构:

public class Solution {

public void swapWithZero(int[] array, int len, int n) {

Main.SwapWithZero(array, len, n);

}

public void sort(int[] array, int len) {

// 完成这个函数

}

}

要求完成这个sort函数,在sort函数中调用swapWithZero函数进行排序,注意这里的n是指要调换的数,并不是在数组中的下标!

分析

首先需要始终明确几点:

数组为[0, n-1],是连续的,只是乱序的。

从始至终只能交换0和其中某个数。

不需要考虑怎么交换

最终排好的数组,下标和该位置上的数相同,这点非常重要

基本思想:

首先将0放到第一位上,还有1->n-1的位置上需要排序

循环n-1次,每次将一个数放到相应的位置上。这里就要用到数组的特点,第1次循环(0已经在下标为0的位置上了)将1放到下标为1的位置上,第2次循环将2放到下标为2的位置上,……,第n-1次循环,将n-1放在n-1的位置上!

下面来看一下我采用的示例{4,5,0,3,1,2}

首先看一下手工推导过程

005RsUADgy1g1wpra7g4rj30kq0hmas4.jpg

这里只是将1交换到相应位置处的过程!

第一步将0和初始数组第一个数交换,将0交换到第一位。

第二步将0和1交换,将1交换到第一个位置上。

第三步将当前正在处理(循环处)的位置下标处(位置1)的数和0交换(有点绕)。

第四步将1和0交换,这样1就到了应该呆的位置上了。同时0又回到了第一个,方便下次操作!

实现(java 1.8)

package sxtest20190409;

/**

* @ClassName: Solution

* @Author: fanjiajia

* @Date: 2019/4/9 下午8:12

* @Version: 1.0

* @Description:

*/

public class Solution {

public static void main(String[] args) {

int[] array = {4,5,0,3,2,1};

Solution solution = new Solution();

solution.sort(array, array.length);

for (int i = 0; i < array.length; i++) {

System.out.print(array[i] + " ");

}

}

public void sort(int[] array, int len) {

// 完成这个函数

// 将0移动到第一位

int firstNum = array[0];

swapWithZero(array, len, firstNum);

// 还有位置1->n-1位置的数需要移动

for (int index = 1; index < len; index++) {

//每次循环将index处放置该位置应该的数(index本身)

swapWithZero(array,len, index); // 将index 放在首位

int indexNum = array[index];

swapWithZero(array, len, indexNum);

swapWithZero(array, len, index);

}

}

public void swapWithZero(int[] array, int len, int n) {

Main.SwapWithZero(array, len, n);

}

}

class Main {

/**

* 交换数组中0和n

* @param array

* @param len

* @param n

*/

public static void SwapWithZero(int[] array, int len, int n) {

/**

* 1 0的位置更改为n

* 2 n的位置改为0

*/

for (int i = 0; i < len; i++) {

if (array[i] == 0) {

array[i] = n;

}

else if (array[i] == n) {

array[i] = 0;

}

}

}

}

这里自定义实现了Main类,以及其中的SwapWithZero函数,这里交换相对简单,直接赋值即可。

最后

此致,敬礼

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
快速排序(QuickSort)是一种高效的排序算法,它的平均时间复杂度为O(nlogn)。它是通过将待排序数组分成两部分,其中一部分的所有元素都比另一部分的所有元素小,然后对这两部分分别进行递归排序,最终将整个数组排序。 以下是Java实现的快速排序代码: ```java public class QuickSort { public static void quickSort(int[] arr, int start, int end) { if (start < end) { int pivot = partition(arr, start, end); quickSort(arr, start, pivot - 1); quickSort(arr, pivot + 1, end); } } private static int partition(int[] arr, int start, int end) { int pivot = arr[end]; int i = start - 1; for (int j = start; j < end; j++) { if (arr[j] <= pivot) { i++; swap(arr, i, j); } } swap(arr, i + 1, end); return i + 1; } private static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } public static void main(String[] args) { int[] arr = {5, 3, 8, 4, 2, 7, 1, 10}; quickSort(arr, 0, arr.length - 1); for (int i : arr) { System.out.print(i + " "); } } } ``` 在这个实现中,我们使用了递归来进行快速排序。首先,我们将数组分成两部分,然后对这两部分分别进行递归排序。在partition函数中,我们选择了数组的最后一个元素作为枢轴(pivot),并通过比较其他元素和枢轴的大小进行交换,将比枢轴小的元素放在枢轴的左边,比枢轴大的元素放在枢轴的右边。最后,我们将枢轴放在数组的正确位置上,并返回该位置。 在这个实现中,我们使用了swap函数来交换数组中的元素。我们也可以使用Java自带的Arrays.sort()函数来进行快速排序,它的实现也是基于快速排序算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值