常见排序算法[java实现](由难到易)
快排
partition
若以起点l为分界线,循环结束r0的含义是从左到右,第一个大于分界线l的下标,交换(l,r0),并返回下标
注意点
left需要保留,含义是分界线的下标
swap
class Solution {
// 快排
public int[] sortArray(int[] nums) {
return quickSort(nums,0,nums.length-1);
}
int[] quickSort(int[] nums, int left, int right)
{
partition(nums,left,right);
return nums;
}
int partition(int[] nums,int left,int right)
{
if(left>right) return -1;
int l=left,r=right,divi=nums[l];
while(true)
{
while(l<=r && nums[l]<=divi) l++;
while(l<=r && nums[r]>divi) r--;
if(l>r) break;
swap(nums,l,r);
}
swap(nums,left,r);
partition(nums,left,r-1);
partition(nums,r+1,right);
return r;
}
void swap(int[] nums,int l,int r)
{
int temp = nums[l];
nums[l] = nums[r];
nums[r] = temp;
}
}
归并
sort
merge(永远记得,单个函数,就事论事,不干跨权限的事情)
例如最后数组拷贝,起点是left,不是0
例如本次合并,界限为right,不是n-1
class Solution {
// 归并排序
public int[] sortArray(int[] nums) {
return sort(nums,0,nums.length-1);
}
public int[] sort(int[] nums,int l,int r)
{
if(l<r)
{
int mid = (l+r)/2;
sort(nums,l,mid);
sort(nums,mid+1,r);
merge(nums,l,r,mid);
}
return nums;
}
void merge(int[] nums,int left,int right,int mid)
{
int oldL = left;
// System.out.println(Arrays.toString(nums)+ " coming l="+left+" r="+right);
int l = left,r=mid+1;
int[] temp = new int[right-left+1];
int k = 0;
while(l<=mid && r<=right)
{
if(nums[l]<nums[r])
{
temp[k++] = nums[l++];
}else{
temp[k++] = nums[r++];
}
}
while(l<=mid) temp[k++] = nums[l++];
while(r<=right) temp[k++] = nums[r++];
for(int i=0;i<k;i++)
{