快排:大于等于的放右边

左边的都小于key,右边的都大于等于key
java实现:
import java.util.*;
public class Quick_Sort {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
Scanner in = new Scanner(System.in);
while(in.hasNext()) {
String s = in.nextLine().replace(" ", ""); //只针对0到9,范围以外需要修改输入判断
int len = s.length();
for (int i = 0; i < len; i++) { //去除无用空格,只针对0到9,范围以外需要修改输入判断
list.add(Integer.parseInt(String.valueOf(s.charAt(i))));
}
q_rec(list,0,list.size()-1); //调用递归
System.out.println(list);
}
}
//排序方法,保证前面数小于key对应的数,后面数大于等于key对应的数
private static int q_sort(List<Integer> list, int from, int to) {
int start = from;
int end = to;
int key = list.get(start);
while (start < end) {
while (end > start && list.get(end) >= key) { //从后往前找到第一个小于key对应的数
end--;
}
if (end > start) { //找到小于key的则覆盖
list.set(start, list.get(end));
start++;
} else {
break;
}
while (start < end && list.get(start) < key) { ////从前往后找到第一个大于等于key对应的数
start++;
}
if (start < end) { //找到大于等于key的则覆盖
list.set(end, list.get(start));
end--;
} else {
break;
}
}
list.set(start, key);
return start;
}
//递归调用排序方法
private static void q_rec(List<Integer> list ,int from,int to){
if(from < to){
int flag = q_sort(list, from, to);
q_rec(list, from, flag-1);
q_rec(list, flag+1, to);
}
}
}
js实现:
function quick_swap(arr,start,end){
var key = arr[start];
var left = start;
var right = end;
while(left < right){
while(left < right && arr[right] > key){
right--;
}
if(left < right){
arr[left] = arr[right];
left++;
}
while(left < right && arr[left] <= key){
left++;
}
if(left < right) {
arr[right] = arr[left];
right--;
}
}
arr[left] = key;
return left;
}
function quick_rec(arr,start,end){
if(start < end){
var flag = quick_swap(arr,start,end);
quick_rec(arr,start,flag-1);
quick_rec(arr,flag+1,end);
}
}
function quick_sort(array){
var arr = array.concat();
var len = arr.length;
quick_rec(arr,0,len-1);
alert(arr);
}

转载于:https://www.cnblogs.com/zawjdbb/p/7125248.html

快速排序是一种高效的排序算法,其核心思想是通过一趟排序将待排序序列分成两个子序列,分别包含比基准元素小和大的元素,然后递归地对这两个子序列进行快速排序[^2]。 ### 快速排序的基本步骤如下: 1. **选择基准**:从数组中选择一个元素作为基准(pivot)。 2. **分区操作**:将数组划分为两部分,使得左边的元素都小于等于基准,右边的元素都大于等于基准。 3. **递归排序**:对左右两部分递归执行上述过程。 ### C++ 实现示例 以下是一个完整的 C++ 实现示例,展示了如何实现快速排序算法: ```cpp #include <iostream> #include <vector> using namespace std; // 分区函数,返回基准元素最终的位置 int partition(vector<int>& arr, int left, int right) { int pivot = arr[left]; // 选择最左边的元素作为基准 while (left < right) { // 从右向左找第一个小于 pivot 的元素 while (left < right && arr[right] >= pivot) right--; if (left < right) arr[left++] = arr[right]; // 从左向右找第一个大于 pivot 的元素 while (left < right && arr[left] <= pivot) left++; if (left < right) arr[right--] = arr[left]; } arr[left] = pivot; // 将基准元素到正确位置 return left; } // 快速排序递归函数 void quickSort(vector<int>& arr, int left, int right) { if (left < right) { int pivotIndex = partition(arr, left, right); // 分区操作 quickSort(arr, left, pivotIndex - 1); // 排序左半部分 quickSort(arr, pivotIndex + 1, right); // 排序右半部分 } } // 主函数测试 int main() { vector<int> nums = {6, 9, 3, 4, 2, 7, 1, 5, 8}; cout << "排序前:"; for (int num : nums) cout << num << " "; cout << endl; quickSort(nums, 0, nums.size() - 1); cout << "排序后:"; for (int num : nums) cout << num << " "; cout << endl; return 0; } ``` ### 输出结果: ``` 排序前:6 9 3 4 2 7 1 5 8 排序后:1 2 3 4 5 6 7 8 9 ``` ### 算法特性与优化 - **时间复杂度**:平均情况下为 $O(n \log n)$,最坏情况为 $O(n^2)$(当输入数据已基本有序时)。 - **空间复杂度**:原地排序,空间复杂度为 $O(1)$。 - **稳定性**:快速排序不是稳定排序算法。 - **小区间优化**:在递归过程中,当子数组长度较小时(例如小于 10),可以切换到插入排序以提高性能,因为插入排序在小规模数据上效率更高。 ### 相关问题说明 - **为什么快速排序在小规模数据中不高效?** 快速排序依赖于递归调用和分区操作,这些操作在小数组中引入了额外的开销。因此,实际应用中常结合插入排序进行优化。 - **快速排序与归并排序的区别是什么?** 快速排序是原地排序,不需要额外存储空间;而归并排序需要辅助数组来合并结果,但它是稳定排序。两者的时间复杂度相似,但在不同场景下表现不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值