912. 排序数组

题目地址:https://leetcode-cn.com/problems/sort-an-array/submissions/

github code :https://github.com/javartisan/edx-ds/blob/master/src/main/java/com/javartisan/leetcode/Solution912.java 

答案1:快速排序 

    

class Solution { public int[] sortArray(int[] nums) { sort(nums,0,nums.length-1); return nums; }   public static void sort(int[] nums,int start,int end){ if(start>=end){ return; } int midIndex = partition(nums,start,end); sort(nums,start,midIndex-1); sort(nums,midIndex+1,end); } // 退出时候 start=end   public static int partition(int[] nums,int start,int end){ int midValue=nums[start]; while(start<end){ while(nums[end]>=midValue && start < end){ end--; } nums[start]=nums[end]; while(nums[start]<=midValue && start < end){ start++; } nums[end] =nums[start];; } nums[end] =midValue; return start; } }

  

答案2:冒泡排序,case 9 数组长度:50000 就超时了

class Solution {
    
    public int[] sortArray(int[] nums) {
        bubble(nums);
        return nums;
    }
    
   public void bubble(int[] nums){
		boolean isHasChange = true;
		for(int i=nums.length-1;i >= 0&&isHasChange;i--){
			isHasChange = false;
			for(int j=0;j<i;j++){
				if(nums[j]>nums[j+1]){
					int tmp =nums[j];
					nums[j]=nums[j+1];
					nums[j+1]=tmp;
					isHasChange=true;
				}
			}
		}
  }
}

  

方案3: 选择排序依旧无法通过case 9

	// 选择排序是在候选集中选择最小的放到前面
	public static void selectSort(int[] nums){

		for (int i=0 , size = nums.length; i < size ; i++) {
		 	int min = i;
			for (int j = i;j < size ; j++ ) {
				if(nums[j]<nums[min]){
					min = j;
				}						
			}
			
			if(min==i){
			    continue;
			}

			int tmp = nums[i];
			nums[i] =nums[min];
			nums[min] =tmp;
		}
	}

  

方案4:
插入排序 可以通过 V1 
	// 假定前面序列是有序的,后面元素逐渐插入到前面元素即可
	public static void insertSort(int[] nums){

		for (int i=0,size = nums.length-1; i<size ; i++ ) {
			int waitToInsertIndex = i+1 ;
			for (int j =0 ; j<=i ; j++ ) {
				if(nums[waitToInsertIndex]<nums[j]){
					int waitToInsertValue = nums[waitToInsertIndex] ;
					for (int k =waitToInsertIndex; k>j ; k-- ) {
						 nums[k]=nums[k-1];						
					}
					nums[j]=waitToInsertValue;
					break;
				}
			}
		}
	}

  

 

插入insertV2

	// 假定前面序列是有序的,后面元素逐渐插入到前面元素即可
	// 对于插入位置使用二分查找 ,但是实际效果并不明显,当找到插入位置之后还有要将插入位置后面的部门元素后移一个位置
	// 如果边找边移动效率会高
	public static void insertSortV2(int[] nums){

		for (int i=0,size = nums.length-1; i<size ; i++ ) {
			
			int waitToInsertIndex = i+1 ;
			int waitToInsertValue =nums[waitToInsertIndex];
			int insertIndex = findInsertIndex(nums,nums[waitToInsertIndex],0,i);

			// 移动元素
			insertIndex = insertIndex<0?0:insertIndex;
			for (int j = waitToInsertIndex;j >insertIndex; j-- ) {
				nums[j]=nums[j-1];
			}
			// insert
			nums[insertIndex] =waitToInsertValue;
		}
	}

	/**
	 *
	 *
	 */
	public static int findInsertIndex(int[] nums,int value,int start,int end){

		while(start< end){
			int mid = (start+end) >>1;
			if(nums[mid]==value){
				return mid + 1;
			}else if(nums[mid]>value){
				end=mid-1;
			}else{
				start = mid+1;
			}
		}
		// 找不到时候,如果目标值大于结束index则返回index+1,否则返回index
		return value>nums[start]?start+1:start;
	}

  

插入V3:

	// 插入排序三个版本中效率最高的版本
	public static void insertSortV3(int[] nums){

		for (int i=0,size = nums.length-1; i < size ; i++ ) {
			
			//边查找insert位置边移动元素
			int waitToInsertValue =nums[i+1];
			int j =i;
			for (; j>=0 ;j--) {
				if(nums[j]<waitToInsertValue){
					break;
				}else{
					nums[j+1] = nums[j];
				}
			}
			nums[j+1] = waitToInsertValue;
		}
	}

 

版本1:遍历有序子数组查找insert位置然后再次遍历移动元素最终插入。

版本2:使用二分查找插入位置之后再遍历移动元素最终插入,这种方案看似效率提升,实际不明显,插入排序主要性能损耗还是移动元素。

版本3:边移动元素边查找插入位置。 效率最高!

 

转载于:https://www.cnblogs.com/leodaxin/p/11217429.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我们来解决您提出的问题。 首先,我们需要定义三个数组,可以像下面这样: ```javascript let arr1 = [1, 2, 3]; let arr2 = [4, 5, 6]; let arr3 = [7, 8, 9]; ``` 接下来,让我们来逐一解决您的问题。 1. 合并数组 要合并数组,我们可以使用concat()方法。该方法将数组连接到一起,并返回新的合并后的数组。下面是示例代码: ```javascript let mergedArray = arr1.concat(arr2, arr3); console.log(mergedArray); // [1, 2, 3, 4, 5, 6, 7, 8, 9] ``` 2. 把数组转换成字符串 要将数组转换为字符串,我们可以使用join()方法。该方法将数组的所有元素连接到一起,并以指定的分隔符分隔。下面是示例代码: ```javascript let str = arr1.join(','); console.log(str); // "1,2,3" ``` 3. 对数组进行排序、反转 要对数组进行排序,我们可以使用sort()方法。该方法将数组的元素按照指定的顺序排序,并返回排序后的数组。如果不传递任何参数,则默认按照字母顺序进行排序。要将数组反转,我们可以使用reverse()方法。该方法将数组的元素倒序排列,并返回反转后的数组。下面是示例代码: ```javascript let sortedArray = mergedArray.sort(); console.log(sortedArray); // [1, 2, 3, 4, 5, 6, 7, 8, 9] let reversedArray = mergedArray.reverse(); console.log(reversedArray); // [9, 8, 7, 6, 5, 4, 3, 2, 1] ``` 4. 数组检索 要在数组中查找元素,我们可以使用indexOf()方法或includes()方法。indexOf()方法返回指定元素的第一个匹配项的索引,如果没有找到匹配项,则返回-1。includes()方法返回一个布尔值,表示数组是否包含指定元素。下面是示例代码: ```javascript // 正向检索 let index = mergedArray.indexOf(5); console.log(index); // 4 // 反向检索 let lastIndex = mergedArray.lastIndexOf(5); console.log(lastIndex); // 4 // 检查元素是否存在 let exists = mergedArray.includes(10); console.log(exists); // false // 条件检索 let filteredArray = mergedArray.filter((element) => element > 5); console.log(filteredArray); // [6, 7, 8, 9] ``` 希望这些代码可以帮助您解决您的问题!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值