递归排序思想
leetcode 88 题:合并两个有序数组
题目:
* 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
*
* 说明:
*
*
* 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
* 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
*
*
* 示例:
*
* 输入:
* nums1 = [1,2,3,0,0,0], m = 3
* nums2 = [2,5,6], n = 3
*
* 输出: [1,2,2,3,5,6]
class Solution {
/* 思想:
假设一个数组nums1[]足够大可以容纳m+n个数且只有前下标前m个有元素 p指向该数组最后位置
p1指向最后 nums1 下标为 m-1 的位置
p2指向最后 nums2 下标为 n-1 的位置
每次比较 下标 p1 与 p2 的大小:
nums[p1]>nums[p2] nums[p]=nums[p1] p-- p1--
nums[p2]>nums[p1] nums[p]=nums[p2] p-- p2--
由于足够大 大于等于 m + n
则当 p1 元素全部比较完只剩下 位置 p2的元素 则将 p2以前为未比较的元素全部复制 p 以前*/
public void merge(int[] nums1, int m, int[] nums2, int n) {
int p1=m-1;//nums1[0...p1]元素待比较
int p2=n-1;//nums1[0...p2]有元素待比较
int p=m+n-1;//nums1[p...m+n-1]元素已经比较好
while(p1>=0&&p2>=0){//还有元素比较
nums1[p--]=(nums1[p1]>=nums2[p2])?nums1[p1--]:nums2[p2--];
}
if(p2>=0){
System.arraycopy(nums2,0,nums1,0,p2+1);
/*源码:public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,int length);
参数:
src:要复制的数组(源数组)
srcPos:复制源数组的起始位置
dest:目标数组
destPos:目标数组的下标位置
length:要复制的长度
*/
}
}
}
对应题目链接:https://leetcode-cn.com/problems/merge-sorted-array/
快速排序思想:
leetcode 75 颜色分类
题目:
* 给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
*
* 此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
*
* 注意:
* 不能使用代码库中的排序函数来解决这道题。
*
* 示例:
*
* 输入: [2,0,2,1,1,0]
* 输出: [0,0,1,1,2,2]
public class Solution4 {
public void sortColors(int[] nums) {
/*三路快排思想
* [0...one]为等于0的元素
* [one+1...i]为等于1的元素
* [two...length-1]为等于2的元素
*
* 遍历下标为i的数组 如果为1 i++
* 如果为0 one++ swap(nums[one],nums[i]) i++ nums[i]=0
* 如果为2 two-- swap(nums[two],nums[i]) nums[i]未比较
* */
int one=-1;
int two=nums.length;
for(int i=0;i<two;){
if (nums[i]==1)
i++;
else if(nums[i]==0){
one++;
int temp =nums[one];
nums[one]=nums[i];
nums[i]=temp;
i++;
}else{//nums[i]=2
//assert (nums[i]!=2);//断言如果不是0,1,2
two--;
int temp =nums[two];
nums[two]=nums[i];
nums[i]=temp;
}
}
}
}
对应题目链接:https://leetcode-cn.com/problems/sort-colors/
--- 来源 leetcode --