程序分享--排序算法--快速排序

关注我,持续分享逻辑思维&管理思维; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;
有意找工作的同学,请参考博主的原创:《面试官心得--面试前应该如何准备》,《面试官心得--面试时如何进行自我介绍》《做好面试准备,迎接2024金三银四》。

-------------------------------------正文----------------------------------------

快速排序:概述
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

中心思想就是:找一个基准值,把数据分为两部分,然后去排序,类似于二分查找。

快速排序:算法描述
从数列中挑出一个元素,称为"基准"(pivot),
重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序。

#include 
using namespace std;
 
void quicksort(int* arr, int low, int high) 
{
    if (low < high) 
    {
        // 获取分区后的枢纽位置
        int pivot_index = partition(arr, low, high);
        
        // 分别对枢纽左右两边的子数组进行递归排序
        quicksort(arr, low, pivot_index - 1);
        quicksort(arr, pivot_index + 1, high);
    }
}
 
int partition(int* arr, int low, int high) 
{
    int pivot = arr[high];
    int i = (low - 1);
    
    for (int j = low; j <= high - 1; j++) 
    {
        if (arr[j] < pivot) {
            i++;
            
            // 交换 arr[i] 和 arr[j]
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    
    // 将枢纽元素放置到正确的位置
    int temp = arr[i + 1];
    arr[i + 1] = arr[high];
    arr[high] = temp;
    
    return i + 1;
}
 
int main() 
{
    int vec = { 4,8,9,2,100,400,20,7,17,31,22,0,1,55,30 };
	cout << "快速排序前:";
	for (int i = 0; i < 15; i++)
		cout << vec[i] << ' ';
	cout << std::endl;

	quicksort(vec, 0, 14);

	cout << "快速排序后:";
	for (int i = 0; i < 15; i++)
		cout << vec[i] << ' ';
	cout << std::endl;
}

你可能感兴趣的:(程序员宝典--常用代码分享,排序算法,数据结构,算法,面试,职场和发展,团队开发)