快速排序(quick sort)

本文介绍了快速排序算法的基本思想及其实现过程,通过C语言代码展示了如何对一个包含10个元素的序列进行排序。在排序过程中,首先选择一个基准元素,然后通过一趟划分将序列分为两部分,再对这两部分进行递归排序,最终实现整个序列的有序排列。

设待排序的表有10个元素,其关键字分别为(6,8,7,9,0,1,3,2,4,5)说明采用快速排序方法进行排序的过程。

快速排序(Quick Sort)的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

在这里插入图片描述

#include <stdio.h>
#define MAXL 100
typedef int KeyType;
typedef char InfoType;

typedef struct
{	KeyType key;
	InfoType data; 
}RecType;

void CreateList(RecType R[],KeyType keys[],int n)
//数组存放所有数据,KeyType保存单个数据,int n保存数据个数
{
	for(int i=0;i<n;i++)
		R[i].key=keys[i];
}

void DispList(RecType R[],int n) //Rec :record 记录 
{
	for(int i=0;i<n;i++)
		printf("%d ",R[i].key);
	printf("\n");
}

int partition(RecType R[],int s,int t)	//一趟划分
{
	int i=s,j=t;                //s:开始 t:结束的下标 
	RecType tmp=R[i];			//以R[i]为基准
	while (i<j)  				//从两端交替向中间扫描,直至i=j为止
	{	while (j>i && R[j].key>=tmp.key)
			j--;				//从右向左扫描,找一个小于tmp.key的R[j]
		R[i]=R[j];				//找到这样的R[j],放入R[i]处
		while (i<j && R[i].key<=tmp.key)//如果是>,则会数不出数据 
			i++;				//从左向右扫描,找一个大于tmp.key的R[i]
		R[j]=R[i];				//找到这样的R[i],放入R[j]处
	}
	R[i]=tmp;
	return i;
}
void QuickSort(RecType R[],int s,int t) //对R[s..t]的元素进行快速排序
{	int i;
	RecType tmp;
	if (s<t) 					//区间内至少存在两个元素的情况
	{	
		i=partition(R,s,t);     //得到基准
		printf("  i=%d: ",i);
		DispList(R,10); 
		QuickSort(R,s,i-1);		//对左区间递归排序
		QuickSort(R,i+1,t);		//对右区间递归排序
	}
}

int main()
{
	int i,n=10;
	RecType R[MAXL];
	KeyType a[]={6,8,7,9,0,1,3,2,4,5};
	CreateList(R,a,n);
	printf("排序前:"); DispList(R,n);
	QuickSort(R,0,n-1);
	printf("排序后:"); DispList(R,n);
	return 0;
}

1)第26、27行代码:
RecType tmp=R[i] 保存基准:6
int i=s,指向最开始元素:6
int j=t ,指向最后的元素:5

2)第28行代码:
i<j(0<9),从两端交替向中间扫描,直至i=j为止

3)第29、30行代码:
R[j].key(5)>R[i].key(6)不成立,
于是,R[i](5)=R[j](5)。

4)第33行代码
R[i].key(6)<=tmp.key(6),成立
i++(1);

一次循环结束:
5 8 7 9 0 1 3 2 4 5

4)第28行代码:
i<j(1<9),从两端交替向中间扫描,直至i=j为止

5)第32行代码:
R[i].key(8)<=tmp.key(6),不成立
于是,R[j](8)=R[i](8);

二次循环结束:
5 8 7 9 0 1 3 2 4 8
在这里插入图片描述

### 快速排序算法工作原理 快速排序是一种高效的排序算法,采用分治策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。基本过程如下: - **选择基准**:从数列中挑出一个元素作为基准(pivot)。 - **分区操作**:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任一边)。在这个分割结束之后,该基准就处于其最终位置。这称为一次划分操作。 - **递归排序**:递归地将小于基准值元素的子数列和大于基准值元素的子数列排序。 通过上述步骤,整个数组变得有序[^3]。 ### Python实现快速排序算法 下面是一个Python版本的快速排序实现例子: ```python def quick_sort(arr): if len(arr) <= 1: return arr else: pivot = arr[len(arr) // 2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right) # 测试代码 if __name__ == "__main__": test_array = [3, 6, 8, 10, 1, 2, 1] print("原始数组:", test_array) sorted_array = quick_sort(test_array) print("排序后的数组:", sorted_array) ``` 这段程序展示了如何利用列表推导式简洁地完成快速排序的操作,并且提供了一个简单的测试案例用于验证函数的功能[^1]。 ### PHP实现快速排序算法 同样地,在PHP中也可以按照相同逻辑编写快速排序算法: ```php <?php function quickSort($array); if ($length <= 1) { return $array; } $left = $right = array(); $pivot = $array[floor($length / 2)]; foreach ($array as $value) { if ($value === $pivot) continue; if ($value < $pivot) { $left[] = $value; } else { $right[] = $value; } } return array_merge(quickSort($pivot), quickSort($right)); } // 测试代码 $testArray = [3, 6, 8, 10, 1, 2, 1]; echo "原始数组: "; print_r($sortedArray = quickSort($testArray); echo "排序后的数组: "; print_r($sortedArray); ?> ``` 此段PHP脚本实现了同样的功能并提供了相应的测试数据以展示效果[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值