快速排序的Partition函数

 1 //数组中两个数的交换
 2     static void swap(int[] nums, int pos1, int pos2){
 3         int temp = nums[pos1];
 4         nums[pos1] = nums[pos2];
 5         nums[pos2] = temp;
 6     }
 7     /**
 8      * 快速排序中,在数组中选择一个数字,将数组中的数字分为两部分
 9      * start, end 介于 0 与 nums.length之间
10      */
11     static int partition(int[] nums, int start, int end){
12
13         int index = new Random().nextInt(end + 1 - start) + start;//范围是[start end]闭区间
14         swap(nums, index, end);
15
16         int small = start - 1;
17         for (index = start; index < end; ++index) {
18
19             if (nums[index] < nums[end]) {
20                 ++small;
21                 if (small != index) {
22                     swap(nums, index, small);
23                 }
24             }
25
26         }
27
28         ++ small;
29         swap(nums, small, end);
30         return small;
31     }

快速排序的Partition函数,布布扣,bubuko.com

时间: 2024-11-11 22:52:13

快速排序的Partition函数的相关文章

快速排序中的partition函数详解

快速排序的精髓就在partition函数的实现.我们构建两个指针,将数组分为三部分,黑色部分全部小于pivot,中间蓝色部分都大于pivot,后面红色部分未知.i指针遍历整个数组,只要它指向的元素小于pivot就交换两个指针指向的元素,然后递增. // arr[]为数组,start.end分别为数组第一个元素和最后一个元素的索引 // povitIndex为数组中任意选中的数的索引 int partition(int arr[], int start, int end, int pivotInd

快速排序 partition函数的所有版本比较

partition函数是快排的核心部分 它的目的就是将数组划分为<=pivot和>pivot两部分,或者是<pivot和>=pivot 其实现方法大体有两种,单向扫描版本和双向扫描版本,但是具体到某个版本,其实现方法也是千差万别,参差不齐.本着严谨治学的态度,我将目前所接触的所有实现列举出来,并作出比较.除了伪代码,我也会给出相应的C&C++实现,供读者参考. 单向扫描: 下面是算法导论中例子 PARTITION(A, p, r) x = A[r] i = p - 1 fo

partition函数两种实现方法

patition函数根据某种比较关系将数组分成两部分,下面根据元素比某个数字大或小,以此为基准划分,给出两种实现方式 1)若数组为a[0]~a[n-1],函数调用如下 partition(a,-1,n-1)a[n-1]一般作为基准元素所在的位置,返回基准元素应该放置的下标 int partition(int *a, int i, int j, int pivot){ do{ while (a[++i] < pivot); while ((j > 0) && (a[--j] &g

find_if函数与partition函数的转换

编写程序,求大于等于一个给定长度的单词有多少.我们还会修改输出,使程序只打印大于等于给定长度的单词. 使用find_if实现的代码如下: #include<algorithm> #include<vector> #include<iostream> #include<string> using namespace std; void biggies(vector<string> &words,vector<string>::s

寻找序列中最小的第N个元素(partition函数实现)

Partition为分割算法,用于将一个序列a[n]分为三部分:a[n]中大于某一元素x的部分,等于x的部分和小于x的部分. Partition程序如下: long Partition (long a[], long p1, long p2) {//对a[p1]~a[p2]进行分割,返回分割点的序号, p1, p2分别为元组的第一 //个和最后一个元素 long i, j; int x; i = p1; j = p2; x = a[i]; while (i<j) {while ( a[j] >

字符串的partition函数

partition函数 str1='sdga2a34'aa=str1.partition('a') print(aa) """ ('sdg', 'a', '2a34') """ rpartition函数,和上面的函数不同,它是从右边开始切割的 str1='sdga2a34' aa=str1.rpartition('a') print(aa)""" ('sdga2', 'a', '34') ""&q

快速排序中的partition函数的枢纽元选择,代码细节,以及其标准实现

很多笔试面试都喜欢考察快排,叫你手写一个也不是啥事.我很早之前就学了这个,对快速排序的过程是很清楚的.但是最近自己尝试手写,发现之前对算法的细节把握不够精准,很多地方甚至只是大脑中的一个映像,而没有理解其真正的本质意图.于是今天结合了<数据结构>(严蔚敏),和<算法导论>进行一番探究. 首先先给出快速排序的严蔚敏版的实现(实际上这部分的partition也是算法导论里面思考题的实现方式,细节可能不一样): 1 public class QuickSort implements So

排序---快速排序及其切分函数Partition应用

快速排序 ??快速排序通过一个切分元素将数组分成两个子数组,左子数组小于等于切分元素,右子数组大于切分元素,将这两个子数组排序,也就是将整个数组排序了. 代码如下: public class Sort{ public static void quickSort(int []arr){ if(arr=null||arr.length<2) return; quickSort(arr,0,arr.length-1); } public static void quickSort(int[]arr,i

C++ 快速排序(sort函数)

快速排序,顾名思义就是速度很快的排序,平均时间复杂度仅为O(n * log2(n)). 例题 洛谷1177 排序 题目描述 将读入的 N 个数从小到大排序后输出. 输入格式 第 1 行为一个正整数 N. 第 2 行包含 N 个空格隔开的正整数 a[i],为你需要进行排序的数,数据保证了a[i]不超过10^9. ? 输出格式 将给定的 N个数从小到大输出,数之间用空格隔开. 输入输出样例 输入1 5 4 2 4 5 1 输出1 1 2 4 4 5 说明提示 对于20% 的数据,有 N <= 10^