问题:
对于给定的含有n个元素的数组a,对其按元素值递增排序。
- 快速排序
1.基本思想:
划分:在待排序的n个元素中任取一个元素(通常取第一个元素)作为基准,把该元素放入最终元素后,整个数据
序列被基准分割成两个子序列,所有小于基准的元素放在前子序列中,所有大于基准的元素放置在后子序列中,并
把基准排在这两个子序列中间。

2.分治策略:
(1)分解:
将原序列a[s…t]分解成两个子序列a[s … i-1]和a[i+1 … t],其中i为划分的基准位置,即将整个问题划分为两个自问题
(2)求解子问题
若子序列长度为0或1,则它是有序的,直接返回;否则,递归求解各个子问题
(3)合并
由于整个序列存放在有序数组a中,合并不需要其他操作
例:对(2,5,1,7,10,6,9,4,3,8)序列,进行快排

3.代码
#include<stdio.h>
void disp(int a[],int n){
int i;
for(int i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
int Partition(int a[],int s,int t){
int i=s,j=t; //i:左指针 j:右指针
int tmp=a[s]; //序列的第一个记录作为基准
while(i!=j){
//从序列两端交替向中间扫描,直到i=j为止
while(j>i&&a[j]>=tmp)
j--; //从右向左扫描,找到第一个关键字小于tmp的a[j]
a[i]=a[j]; //将a[i]前移到a[i]的位置
while(i<j&&a[i]<tmp)
i++; //从左向右扫描,找到第一个关键字大一tmp的a[i]
a[j]=a[i]; //将a[i]后移到a[j]的位置
}
a[i]=tmp;
return i;
}
void QuickSort(int a[],int s,int t){
if(s<t){
int i=Partition(a,s,t);
QuickSort(a,s,i-1); //对左子序

本文深入探讨了两种高效的排序算法:快速排序和归并排序。详细解释了这两种算法的基本思想、分治策略及其实现代码,通过实例演示了算法的具体运行过程。
&spm=1001.2101.3001.5002&articleId=108204785&d=1&t=3&u=dc65c17a502c43358635a2d74fea93f7)
5730

被折叠的 条评论
为什么被折叠?



