1.归并算法
class Solution {
int[] temp;
public int[] sortArray(int[] nums) {
temp = new int[nums.length];
mergeSort(nums,0,nums.length-1);
return nums;
}
//归并排序
//表明对数组nums中区间[left,right]中的元素排序
public void mergeSort(int[] nums,int left,int right){
if(left >= right){
return;
}
int mid = left + (right-left)/2;
//首先最左右分区进行排序
mergeSort(nums,left,mid);
mergeSort(nums,mid+1,right);
//将排好序的子区间合并在temp数组中
int i = left;
int j = mid+1;
int index = 0;
while(i <= mid && j <= right){
if(nums[i] <= nums[j]){
temp[index] = nums[i++];
}else{
temp[index] = nums[j++];
}
index++;
}
while(i <= mid){
temp[index] = nums[i];
index++;
i++;
}
while(j <= right){
temp[index] = nums[j];
index++;
j++;
}
//将临时数组中的元素放回nums数组中
for(i = left;i <= right;i++){
//细节问题:temp临时数组每次使用都是从0开始储存,而nums则是从left到right
nums[i] = temp[i-left];
}
}
}
2.快速排序
class Solution {
public int[] sortArray(int[] nums) {
int n=nums.length;
quickSort(nums,0,n-1);
return nums;
}
public void quickSort(int[] arr,int left,int right){
if(left>right)return;
if(arr==null&&arr.length==0)return;
int key=arr[left];
int l=left;
int r=right;
while(l!=r){
//注意从右边先开始
while(key<=arr[right])r--;
while(key>=arr[left])l++;
if(l<r){
int temp=arr[l];
arr[l]=arr[r];
arr[r]=temp;
}
}
arr[left]=arr[l];
arr[l]=key;
quickSort(arr,left,l-1);
quickSort(arr,l+1,right);
}
}
本文详细介绍了两种经典的排序算法——归并排序和快速排序。归并排序通过递归将数组分为两半,然后合并已排序的子数组。快速排序则采用分治策略,选取基准值并重新排列数组,将数组不断划分为较小和较大的部分,直至所有元素有序。这两种算法在实际应用中各有优势,理解其工作原理对于优化算法性能至关重要。
1184

被折叠的 条评论
为什么被折叠?



