和 LeetCode Battle (12、排序数组 )

题目:912. 排序数组

给你一个整数数组 nums,请你将该数组升序排列。

使用选择排序解决

public static int[] sortArray(int[] nums) {
        //判断数组是否为空 或者只有一个元素
		if(nums.length <2 | nums == null) {
			return nums;
		}
		//循环数组 比较大小 这里i< length-1 下面的j才不会发生数组越界 而且外层循环只需遍历length-1次即可
		for(int i = 0; i <nums.length-1; i ++) {
			int minIndex = i;
			for(int j = i+1; j < nums.length; j++) {
				minIndex = nums[j] < nums[minIndex] ? j : minIndex;
			}
			if(i != minIndex) {
				swap(nums,i,minIndex);
			}
		}
		return nums;
	}
	public static void swap(int[] nums,int i ,int minIndex) {
		int temp = nums[i];
		nums[i] = nums[minIndex];
		nums[minIndex] = temp;
	}

emmm 一提交 显示超出运行时间

最后只能改用快速排序来解决…

public int[] sortArray(int[] nums) {
        quickSort(nums, 0, nums.length - 1);
        return nums;
	}
    private void quickSort(int[] nums, int left, int right) {
        if (left >= right) {
            return;
        }
        int pivot = findPivotAndReorder(nums, left, right);
        quickSort(nums, left, pivot - 1);
        quickSort(nums, pivot + 1, right);
    }
    private int findPivotAndReorder(int[] nums, int left, int right) {
        int pivotIndex = left + (int)(Math.random() * (right - left + 1));
        int pivot = nums[pivotIndex];
        swap(nums, pivotIndex, right);
        int l = left, r = right - 1;
        while (l <= r) {
            if (nums[l] <= pivot) {
                l++;
            } else if (nums[r] >= pivot) {
                r--;
            } else {
                swap(nums, l++, r--);
            }
        }
        swap(nums, l, right);
        return l;
    }

    private void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }

顺便复习复习 选择排序

public static void selectSort(int[] arrs) {
		long startTime = System.nanoTime();//获取开始时间
		
		//判断数组是否为空 或者只有一个元素
		if(arrs.length <2 | arrs == null) {
			return ;
		}
		//循环数组 比较大小 这里i< length-1 下面的j才不会发生数组越界 而且外层循环只需遍历length-1次即可
		for(int i = 0; i <arrs.length-1; i ++) {
			int minIndex = i;
			for(int j = i+1; j < arrs.length; j++) {
				minIndex = arrs[j] < arrs[minIndex] ? j : minIndex;
			}
			if(i != minIndex) {
				swap(arrs,i,minIndex);
			}
		}
		long endTime = System.nanoTime();//获取结束时间
		System.out.println("程序共运行了 "+(endTime-startTime) +"纳秒");
	}
	public static void swap(int[] arrs,int i ,int minIndex) {
		int temp = arrs[i];
		arrs[i] = arrs[minIndex];
		arrs[minIndex] = temp;
	}

第15行代码执行前 先进行判断 对于数据量小的数组 执行时间有明显的提升

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值