(数据结构 “快速排序” 学习整理,及个人理解)
1. 本质上是一种分治思想(表格实例) :
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
24 | 15 | 26 | 10 | 9 | 43 | 97 | 13 |
首先将 24 作为关键字 low =0(直接等于1,也可以不影响结果,但要考虑只有一个数的情况 )high=7
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
13 | 15 | 26 | 10 | 9 | 43 | 97 | 24 |
先从high开始,high=7时13 小于 24 所以交换位置(代码中可以只将13换过去,而24先不放进去,直到最后low=high时,也就是确定位置后直接将 24放入节约交换次数(不懂没关系往下看))。high依旧=7
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
13 | 15 | 24 | 10 | 9 | 43 | 97 | 26 |
再看low 向后走知道找到比24大的数字 ,是26 ,low=2,将26与24交换。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
13 | 15 | 9 | 10 | 24 | 43 | 97 | 26 |
再看high 向前走 找到比24小的数,(相等的数依旧在原位,是不进行交换的)
比24 小的数是 9 将24 与9 交换
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
13 | 15 | 9 | 10 | 24 (low ,high) | 43 | 97 | 26 |
low向后走没有发现比24大的数字,当low与high重合时,一次交换结束
这之后
将数组分为两半 第一半 low=0 ,high=3;另一半 low=5,high=7.
分别对两部分重复上述过程。
直至所有小部分low=high
说明排序完成。
#include <stdio.h>
#include <stdlib.h>
#include <ctime>
void QuickSort(int **num,int head,int tail);
#define N 10
int main()
{
int *num=(int *)malloc(sizeof(int)*N);
srand(time(NULL));
for(int i=0;i<N;i++)
num[i]=rand()%(i*200+100);
QuickSort(&num,0,N-1);
for(int i=0;i<N;i++)
printf("%d ",num[i]);
}
void QuickSort(int ** num,int head ,int tail) *****快速排序函数
{
int h=head,t=tail;
if (head<tail)
{
int te=*(*num+head);
while(head<tail)
{
while (head<tail&&*(*num+tail)>te)
tail--;
*(*num+head)=*(*num+tail);
while(head<tail&&*(*num+head)<te)
head++;
*(*num+tail)=*(*num+head);
}
*(*num+head)=te;
QuickSort(num,h,tail-1);
QuickSort(num,head+1,t);
}
}
(代码是看书(数据结构,严蔚敏教授)理解后敲的);