zoukankan      html  css  js  c++  java
  • [算法]自然数数组的排序

    题目:

    给定一个长度为N的整型数组arr,其中有N个互不相等的自然数1~N,请实现arr的排序,但是不要把下标0~N-1位置上的数值通过直接赋值的方式替换成1~N。

    要求:时间复杂度为O(N),额外空间复杂度为O(1)。

    思路:

    1.从左向右遍历arr,假设当前遍历到i位置。

    2.if arr[i]==i+1,不需要调整,继续遍历。

    3.if arr[i]!=i+1,进行调整。

    根据调整功能的方法不同,可以有不同的实现过程。

    方法一:

    public static void sort1(int[] arr) {
    
    		int tmp = 0;
    
    		int next = 0;
    
    		for (int i = 0; i != arr.length; i++) {
    
    			tmp = arr[i];
    
    			while (arr[i] != i + 1) {
    
    				next = arr[tmp - 1];
    
    				arr[tmp - 1] = tmp;
    
    				tmp = next;
    
    			}
    
    		}
    
    	}
    

    方法二:

    public static void sort2(int[] arr) {
    
    		int tmp = 0;
    
    		for (int i = 0; i != arr.length; i++) {
    
    			while (arr[i] != i + 1) {
    
    				tmp = arr[arr[i] - 1];
    
    				arr[arr[i] - 1] = arr[i];
    
    				arr[i] = tmp;
    
    			}
    
    		}
    
    	}
  • 相关阅读:
    java io
    java 线程
    java 引用
    spring面试合集
    jvm(6):JMM
    jvm(n):JVM面试
    jvm(5):类加载机制
    jvm(4):类文件结构
    C# UDP编程简介
    Facebook 对 Memcache 伸缩性的增强
  • 原文地址:https://www.cnblogs.com/xiaomoxian/p/5188102.html
Copyright © 2011-2022 走看看