快速排序思想及C语言代码

本文详细介绍了快速排序的基本思想和实现过程,提供了两种不同的实现方法,并对比了其与冒泡排序的区别,强调了快速排序的高效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速排序的思想(以从小到大为例)

(1)第一次排序

选取数组内的一个元素作为标准,将数组分为两部分;将小于该标准的元素存放在该标准的左边,大于该标准的元素放在右边,完成第一次排序;

(2)第二次排序

对分割后的两部分数组分别进行排序(递归的调用)。

基本方法

1)创建函数,传递的参数分别是数组的地址数组首个元素的位置数组元素的末位置

2)在函数中声明三个变量xbeginendx用来取为标准元素beginend分别用来接收传参的后两个数值作为记录循环的位置);

3)我先将数组的首个元素作为标准元素(即x=str[begin]),先从数组的末位置开始与x进行比较,如果小于x则进行交换;再从数组的首位置开始与x进行比较,如果大于x则进行交换,直到begin>=end;完成第一次排序;

4)前三个步骤完成后,数组被分为两部分:一部分是小于标即准元素,一部分是大于标准元素。将左右两部分分别进行排序(即调用创建的函数),完成第二次排序。


例:待排序的数组str:42,25,56,34,21

#include<stdio.h>
#include<stdlib.h>
void QuickSort(int str[],int i,int j)
{
	int begin=i,end=j;
	int x=str[i];
	if(begin<end)
	{			
		while(begin<end)
		{
			while(begin<end&&str[end]>x)
			end--;
			if(begin<end)
			str[begin++]=str[end];
			while(begin<end&&str[begin]<x)
			begin++;
			if(begin<end)
			str[end--]=str[begin];
		}
		str[begin]=x;
		QuickSort(str,i,end-1);//用递归将选取的标准数左右两边都进行排序
		QuickSort(str,begin+1,j);
	}
}
int main()
{
	int str[5]={42,25,56,34,21};
	int i=0,j=4;
	QuickSort(str,i,j);
	for(i=0;i<5;i++)
	printf("%3d",str[i]);
}


基本方法2

第二种方法与第一种方法的思路大致相同,两者的区别在于交换数据的时候,第一种是先在右边开始找到第一个交换的数字,在交换后再从左边进行交换,通过x记录了被覆盖的str[0],直到i=j;第二种方法因为选择的也是str[0]作为标准,然后也是右边即end先走找到小于str[0]的数字后,begin再开始走,直到找到大于str[0]的数字,用三步法进行交换,这种方法比较简单易懂。

例:待排序的数组str:42,2556,34,21

#include<stdio.h>
#include<stdlib.h>
void QuickSort(int str[],int i,int j)
{
	int begin=i,end=j;
        int x=str[i];
        if(begin > end) return;
	while(begin<end)
	{
		while(begin<end&&str[end]>x)
		end--;
		while(begin<end&&str[begin]<x)
		begin++;
		if(begin<end)
		{
			int temp=str[end];
			str[end]=str[begin];
			str[begin]=temp;
		}
		QuickSort(str,i,begin - 1);
		QuickSort(str,end + 1,j);
	}
}
int main()
{
	int str[]={42,25,56,34,21};
	int i=0,j=4;
	QuickSort(str,i,j);
	for(i=0;i<5;i++)
	printf("%3d",str[i]);
	return 0;
}



快速排序的作用

相对于冒泡排序而言,每次交换都是跳跃式的,不像冒泡排序一样只能在相邻的两个数之间进行交换,交换的次数较少,提高了程序的运行速度。在最差的情况下,时间复杂度仍和冒泡排序一样是O(N^2),但是平均复杂度O(NlonN)

以下是快速排序算法在C语言中的实现代码: ```c #include <stdio.h> // 函数声明 void swap(int* a, int* b); int partition (int arr[], int low, int high); void quickSort(int arr[], int low, int high); // 主函数用于测试快速排序 int main() { int arr[] = {10, 7, 8, 9, 1, 5}; int n = sizeof(arr)/sizeof(arr[0]); printf("Original array:\n"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } quickSort(arr, 0, n-1); // 调用快速排序 printf("\nSorted array:\n"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; } // 快速排序的核心逻辑 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); // 对右子数组进行递归排序 } } // 分区函数,返回分区点的位置 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函数完成交换 } } swap(&arr[i + 1], &arr[high]); // 最终将枢轴放置到正确位置 return (i + 1); } // 交换两个整数的值 void swap(int* a, int* b) { int t = *a; *a = *b; *b = t; } ``` 此代码实现了标准的快速排序算法。其中 `partition` 函数负责重新排列数组并找到分界点,而 `quickSort` 则通过递归调用来分别处理左右两部分。 ### 解释 快速排序是一种基于分治法的高效排序方法[^4]。它的基本思想是选择一个基准元素(pivot),然后将数组划分为两部分:一部分包含所有小于基准的元素,另一部分包含所有大于等于基准的元素。接着对这两部分递归应用相同的策略直到整个数组有序为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值