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;
    
    			}
    
    		}
    
    	}
  • 相关阅读:
    算分-DESIGN THECHNIQUES
    高级数据结构笔记摘要
    红黑树和AVL树笔记摘要
    索引笔记摘要
    检索笔记摘要
    外排序笔记摘要
    内排序笔记摘要
    线性表总结
    数论的一点前置知识
    线段交模板
  • 原文地址:https://www.cnblogs.com/xiaomoxian/p/5188102.html
Copyright © 2011-2022 走看看