快速排序(递归)

快速排序(递归)

//因为最近时间问题,该博客待完善
快速排序,时间复杂度:理想的情况是,每次划分所选择的中间数恰好将当前序列几乎等分,经过log2n趟划分(一次划分算法从两头交替搜索,直到low和hight重合,因此一次划分算法的时间复杂度是O(n);),整个算法的时间复杂度为O(nlog2n)。最坏情况:O(n2)。
快速排序很好理解,不过源码写起来如果不参考书籍的话可能需要耗费一定时间去思考,我就没有参考书籍.下面就是我用递归写的快速排序,仅供参考.

#include <iostream>
#include <time.h>
#include <stdlib.h>
/*
*输入随机数列元素个数,自动生成并排序
*/
using namespace std;

int speedSort(int* p,int *low,int* high);

int main()
{
	srand(time(NULL));

	int length = 0;
	cout << "Please enter array's length"<<endl;
	cin >> length;
	int* a = new int[length];
	cout << "Please enter the elements"<<endl;
	for (int i = 0; i < length; i++)
		a [i]=rand()%(length+1);

	speedSort(a,&a[0],&a[length-1]);
	for (int i = 0; i < length; i++)
		cout << a[i] << ' ';
	return 0;
}

int speedSort(int* p,int *low,int *high)
{
	int m;
	int* y1 = low, * y2 = high;
	while (low < high)
	{
		if (*low <= *high)
			high--;
		else
		{
			m = *low;
			*low = *high;
			*high = m;
			low++;
			while(low < high && *low <= *high)
				low++;
			if(low < high && *low > *high)
			{
				m = *low;
				*low = *high;
				*high = m;
				high--;
			}
		}
	}
	if (y1 < low - 1)
		speedSort(p, y1, low - 1);
	if (y2 > low + 1)
		speedSort(p, low + 1, y2);
	return 0;
}

你的赞就是我不托更的动力(●’◡’●)

### 快速排序递归实现详解 快速排序是一种基于分治法的高效排序算法,其核心思想是通过选取一个基准值(pivot),将数组划分为两部分:一部分中的所有元素均不大于基准值,另一部分中的所有元素均不小于基准值。随后分别对这两部分递归执行相同的操作。 以下是两种常见编程语言中快速排序递归实现: #### Python 实现 以下是一个标准的 Python 版本的快速排序递归实现[^2]: ```python def quicksort(arr): """ 快速排序函数 参数: arr -- 待排序的列表 返回: 排序后的列表 """ if len(arr) <= 1: # 基线条件:如果列表为空或只有一个元素,则无需进一步划分 return arr else: pivot = arr[0] # 选择第一个元素作为基准值 less = [i for i in arr[1:] if i <= pivot] # 小于等于基准值的部分 greater = [i for i in arr[1:] if i > pivot] # 大于基准值的部分 return quicksort(less) + [pivot] + quicksort(greater) # 测试代码 example_array = [10, 7, 8, 9, 1, 5] sorted_array = quicksort(example_array) print("原数组:", example_array) print("排序后数组:", sorted_array) ``` 此版本的时间复杂度为 O(n log n),但在最坏情况下可能退化至 O()。 --- #### C语言实现 对于 C 语言而言,可以采用指针操作来优化空间效率并减少额外内存分配的需求[^1]。下面是一段经典的 C 语言实现代码: ```c #include <stdio.h> // 定义交换两个数的辅助函数 void swap(int* a, int* b) { int t = *a; *a = *b; *b = t; } // 分区函数 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++; // 更新较小元素索引 swap(&arr[i], &arr[j]); // 交换位置 } } swap(&arr[i + 1], &arr[high]); // 将基准值放置到正确的位置 return (i + 1); } // 快速排序递归函数 void quickSort(int arr[], int low, int high) { if (low < high) { int pi = partition(arr, low, high); // 获取分区点 quickSort(arr, low, pi - 1); // 对左半部分递归调用 quickSort(arr, pi + 1, high); // 对右半部分递归调用 } } // 主测试函数 void printArray(int arr[], int size) { for (int i = 0; i < size; i++) printf("%d ", arr[i]); printf("\n"); } int main() { int arr[] = {10, 7, 8, 9, 1, 5}; int n = sizeof(arr) / sizeof(arr[0]); printf("原始数组:\n"); printArray(arr, n); quickSort(arr, 0, n - 1); printf("排序后数组:\n"); printArray(arr, n); return 0; } ``` 上述代码展示了如何利用 `partition` 函数完成一次分割,并通过递归方式处理剩余未排序区域。 --- ### 总结 无论是 Python 还是 C 的实现,都遵循了相同的逻辑框架——即选定基准值、重新排列序列以及递归地应用于子区间上。尽管两者语法不同,但它们的核心理念完全一致。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值