随机化快速排序

var
  n,i:longint;
  a:array[1..100000] of longint;
procedure swap(var a,b:longint);
var
  t:longint;
begin
  t:=a;a:=b;b:=t;
end;
procedure qsort(l,r:longint);
var
  i,j,m:longint;
begin
  i:=l;
  j:=r;
  m:=a[random(r-l+1)+l];{注意啦,要减1,因为random只会生成<n的随机数}
  repeat
    while a[i]
    while a[j]>m do dec(j);
    if i<=j then
      begin
        swap(a[i],a[j]);
        inc(i);
        dec(j);
      end;
  until i>j;
  if j>l then qsort(l,j);
  if i
end;
begin
  randomize;{写在主程序里}
  read(n);
  for i:=1 to n do
    read(a[i]);
  qsort(1,n);
  for i:=1 to n do
    write(a[i],' ');
end.
随机化快速排序是对经典快速排序的一种改进版本。它通过引入随机性来减少特定输入序列对算法效率的影响,特别是当输入已经接近有序的时候。核心思路是在每次划分之前不是固定选取某个位置的元素(如最后一位或第一位)作为基准值(pivot),而是随机从当前处理区间内选取出一个元素当作基准值。 以下是Java实现示例: ```java import java.util.Random; public class RandomizedQuickSort { public static void main(String[] args) { int[] arr = {5, 3, 8, 4, 2, 7, 1, 10}; randomizedQuicksort(arr, 0, arr.length - 1); for (int num : arr) { System.out.print(num + " "); } } // 主函数randomizedQuicksort public static void randomizedQuicksort(int[] nums, int start, int end) { if(start < end){ int pivotIndex = randomizedPartition(nums, start, end); randomizedQuicksort(nums, start, pivotIndex - 1); // 左侧继续快排 randomizedQuicksort(nums, pivotIndex + 1, end); // 右侧继续快排 } } // 随机选择并进行分区操作 private static int randomizedPartition(int[] nums, int p, int r){ Random rand = new Random(); int i = p + rand.nextInt(r-p+1); // 在 [p...r] 范围内生成一个随机索引 swap(nums, i, r); // 将选定的随机元素放到末尾 return partition(nums, p, r); // 执行常规的partion过程 } // 分区操作 private static int partition(int[] nums, int l, int h){ int x = nums[h]; int i = l - 1; for(int j=l; j<h; j++){ if(nums[j] <=x ){ i++; swap(nums, i, j); } } swap(nums, i+1, h); return i+1; } // 元素互换辅助函数 private static void swap(int[] a, int m, int n){ int temp = a[m]; a[m] = a[n]; a[n] = temp; } } ``` 上面代码展示了随机化快速排序的基本框架及其实现细节,并在`main()`方法里测试了该算法的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值