首页 > 其他分享 >快速排序 分区函数

快速排序 分区函数

时间:2023-05-31 16:37:41浏览次数:37  
标签:index arr end 函数 int 分区 pivot array 排序

适合我的快排分区函数:

def patition2(arr, l, r):
    pivot = arr[l]
    index = l+1
    for i in range(l+1, r+1):
        if arr[i] < pivot:
            arr[i], arr[index] = arr[index], arr[i]
            index += 1
    arr[l], arr[index-1] = arr[index-1], arr[l]
    return index-1

 

注意要点:

1、返回index-1,非常关键!!!因为 assert arr[index-1] < pivot and arr[index]>=pivot

2、注意判定条件是 <,当然 <= 也是可以的!!!

3、注意index起始位置是L+1

4、循环的起始位置也是L+1

 

网上的其他写法:

// C++
void Swap(int &first_number, int &second_number) {
    int temp        = first_number;
    first_number    = second_number;
    second_number   = temp;
}

int Partition(int array[], int start, int end, int pivot_index) {
    int pivot       = array[pivot_index];
    int store_index = start;

    Swap(array[pivot_index], array[end]);
    for (int iLoop = start; iLoop < end; iLoop++) {
        if (array[iLoop] < pivot) {
            Swap(array[iLoop], array[store_index]);
            store_index++;
        }
    }
    Swap(array[store_index], array[end]);

    return store_index;
}

  

 

template<class T>
int Partition(T a[], int start, int end, int pivotIndex){
    T pivot = a[pivotIndex];
    Swap(a[pivotIndex], a[end]);
    int storeIndex = start;
    for(int i = start; i < end; ++i) {
        if(a[i] < pivot) {
            Swap(a[i], a[storeIndex]);
            ++storeIndex;
        }
    }
    swap(a[storeIndex], a[end]);
    return storeIndex;
}

  

 

分区的思想,还可以用在解决计算中值和选择问题上。

//中值问题
	public static int getMedian(int[] array){
		return getKth(array,array.length/2);
	}
	//选择问题
	public static int getKth(int[] array,int k){
		int low =0,high = array.length -1;
		int s = 0;
		do{
			s = partition(array,low,high);
			if(s>k) high = s-1;
			else low = s+1;
		}while(s != k);
		return array[s];
	}

  

标签:index,arr,end,函数,int,分区,pivot,array,排序
From: https://blog.51cto.com/u_11908275/6387990

相关文章

  • 概率生成函数
    概率生成函数认识概率生成函数,形如\[f(x)=\sum_{i=0}^{+\infty}P(X=i)x^i\]也就是 i 次项的系数是随机变量 X 等于 i 的概率。这个东西有两个用处:1关于概率\(f(1)=1\)其实就是把 \(f(x)\) 的所有系数加起来,而这里的系数就是概率2关于期望想一想,上面的......
  • UE4中的蓝图函数库
    #蓝图函数库此文为AssertionsBlueprintFunctionLibraries(opensnewwindow)的原创翻译,本文内容版权归原文所有,仅供学习,如需转载望注本文地址,翻译不易,谢谢理解我们在开发中经常发现需要一系列工具函数来让开发更简单。这些函数经常是无状态的,并且在各种gameplay框架代码中......
  • 编译器绕过拷贝构造函数和返回值优化
    写在前面:在拷贝初始化(也就是用等号初始化,注意使用拷贝构造函数创建一个新的对象不属于拷贝初始化)过程中,编译器可以(但不是必须)跳过拷贝构造函数或者移动构造函数,直接创建对象。1stringnull_book="999";2//可以改写为3stringnull_book("999");这里面”999“隐式的转换为......
  • 实现memcpy()函数过程总结
    1.按字节实现1)初步版本void*my_memcpy(void*dst,constvoid*src,intn){if(dst==NULL&&src==NULL&&n<=0)returnNULL;char*s=(char*)src;char*d=(char*)dst;while(n--){*d++=*s++;}returnd......
  • 欧拉函数与容斥
    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意:给定五个数,其中有和,求满足条件的有序对的个数。题目中    明确说在所有的输入中。分析:问题可以转化为和时,的有序对的个数。那么先比较和的    大小,相同的部分可以用欧拉函数的累加计算,没有公共的部分用容斥计算......
  • 原地归并排序
    今天讨论的问题是InplaceMergeSort,即原地归并排序。相比传统的归并排序,它的空间复杂度仅为。 在原地归并排序中最主要用到了内存反转,即交换相邻的两块内存,在《编程珠玑》中又被称为手摇算法。内存反转是这样的:给定序列,把它变为,要求空间为。分析:本问题的方法很经典,先对反转,再对反......
  • 关于C++字符串的一些函数
    其实印象里,c的char用法反倒比c++的string深一点,可能是因为我对string的运用太少了吧。 提到C++的string,就得先提一下首先提一下C的char类型,毕竟C++是根据C延展过来的,继承了C的特性,而且C本身是没有string这个东西的。 char是什么?一个关键字,用于声明一个变量是字符类型。好吧,......
  • Python 函数
    函数返回多个返回值defmultiple_return_value():importdatetimed=datetime.date.today()val_1='年份为:{}'.format(d.year)val_2='月份为:{}'.format(d.month)returnval_1,val_2#只需在return关键字后跟多个值(依次用逗号分隔)val=mult......
  • python 中 re.match和re.search()函数
     两者都返回首次匹配字符串的索引,re.match函数只从头开始匹配,re.search函数不限制只从头开始匹配。001、re.match函数[root@PC1test2]#python3Python3.10.9(main,Mar12023,18:23:06)[GCC11.2.0]onlinuxType"help","copyright","credits"or"license"......
  • C/C++杂记:虚函数的实现的基本原理
    1.概述简单地说,每一个含有虚函数(无论是其本身的,还是继承而来的)的类都至少有一个与之对应的虚函数表,其中存放着该类所有的虚函数对应的函数指针。例:其中:B的虚函数表中存放着B::foo和B::bar两个函数指针。D的虚函数表中存放的既有继承自B的虚函数B::foo,又有重写(override)了基......