快速排序置随机数代码实现
来源:互联网 发布:制衣打菲软件 编辑:程序博客网 时间:2024/06/05 17:50
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace SortLib{ class QuickkSort { static Random random = new Random(); /// <summary> /// 快速排序 /// </summary> /// <param name="p">序列的起点</param> /// <param name="q">序列的终点</param> /// <param name="nums">用于排序的数组</param> public static void QuickSort(int p, int q, int[] nums) { //q大于p结束条件 保证最后一个数的时候可行 if (q > p) { int r = Partition(p, q, nums); QuickSort(p, r - 1, nums); QuickSort(r + 1, q, nums); } } /// <summary> /// 初始化一个随机数 与末尾数交换 /// </summary> /// <param name="p"></param> /// <param name="q"></param> /// <param name="nums"></param> /// <returns></returns> private static int RandomPartiition(int p, int q, int[] nums) { int ran = random.Next(p, q); exchange(ref nums[ran], ref nums[q]); return Partition(p, q, nums); } /// <summary> /// 以最后一个数分割,小的放左边,大的放右边 /// </summary> /// <param name="p"></param> /// <param name="q"></param> /// <param name="nums"></param> /// <returns></returns> private static int Partition(int p, int q, int[] nums) { //记录小数,以保证i+1为大数 int i = p - 1; //以最后一个数切割 int key = nums[q]; for (int j = p; j < q; j++) { if (nums[j] < key) { //小的话就让i+1也就是大数与这个小数交换 i++; exchange(ref nums[i], ref nums[j]); } } exchange(ref nums[q], ref nums[i + 1]); return i + 1; } private static void exchange(ref int a, ref int b) { int temp = 0; temp = a; a = b; b = temp; } }}