1. 快速排序
1.1 方法1
思路:
-
在数据集中,选择一个元素作为"基准(pivot)"
-
分区(partition):所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素都移到"基准"的右边
-
分区操作结束后,基准元素所处的位置就是最终排序后它所处的位置
-
对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集都只剩下一个元素为止
/**
* @param arr 待排序数组
* @param low 数组第一个元素索引
* @param high 数组最后一个元素的索引
* @return 排序后的数组
*/
public static int[] quickSort(int[] arr,int low,int high) {
//对low和high进行大小判断(此处如果仅对数组arr做非空及是否有元素判断会出现栈溢出)
if(low >= high) {
return arr;
}
//将arr一分为二
int middleIndex = partition(arr,low,high);
//对基准左边的进行递归排序
quickSort(arr,low,middleIndex-1);
//对基准右边的进行递归排序
quickSort(arr,middleIndex+1,high);
return arr;
}
1.2 方法2
/**获得"基准"(默认是最低位low)在数组排序后所在位置
* @param arr 待查找数组
* @param low 开始位置
* @param high 结束位置
* @return "基准"所在位置
*/
private static int partition(int[] arr, int low, int high) {
//每次都假设数组第一个位置的元素作为基准
int temp = arr[low];
while (low < high) {
while (arr[high] >= temp && high > low) {//后半部分向前扫描
//将临时基准元素与其右边的元素依次比较,值大于等于它的将high--
//当low<=high时,获取到等于或小于临时基准元素的元素
high--;
}
//将小于或等于基准元素的元素移到基准元素左边最低端
arr[low] = arr[high];
while (arr[low] <= temp && high > low) {//从前半部分扫描
low++;
}
//将大于或等于基准元素的元素移到基准元素右边最高端
arr[high] = arr[low];
}
//基准值
arr[low] = temp;
//返回最终基准
return low;
}
2. 选择排序
2.1 方法1
思路:
-
<