关于递归排序。

(个人总结,如有遗漏或错误之处,请予以指正,谢)

快排,可以理解为一种类似分而治之的思路,当然最主要的是递归的思想。所谓递归,这里就不做具体介绍了。说的直接明了,就是函数体,自己调用自己。不最重要的一点,也是自己曾经犯过的错误,一定不要忘了加入递归出口,否则会进去死循环。直接就没有输出了。

 

那么接下来,我们先来熟悉一下快排的思路。就是以数组中的某一个元素为标准,将大于它的元素全部移到右边,小于它的全部移到左边。这样就完成了第一步。剩下的就是对第一部完成后的结果左边的一部分再次进行同样的处理。右边的也进行同样的处理。等到最后分离后的每一段长度都为1时则说明全部处理完成。可能大家对这个过程还有点小小的懵懵懂懂。自己试着去敲几次就差不多熟悉了。

下面我们看代码。

#include<string.h>

#include<stdlib.h>

#include<stdio.h>

void Quickly_Sort(int *a, int l); //声明排序函数,形参包括一个数组,一个数组长度

int main()

{

int i;

int N;//n用于存储数组长度;

printf("请输入数组长度\n");

scanf("%d",&N);

int *n=(int *)malloc(N*sizeof(int));//为数组申请内存

for (i = 0; i < N; i++) //循环输入数组。

scanf("%d", &n[i]);

Quickly_Sort(n, N);

for (i = 0; i < N; i++)

printf(" %d ,", n[i]);

printf("\n");

}

void Quickly_Sort(int a[], int l)

{

int Criterion = *a; //以第一个数为标准,进行第一次递归。

int i = 0, j = l - 1, cnt = 0; //初始化变量,cnt用于记录标准数的位置。

while (i != j)

{

for (; j > i; j--) //循环自左往右寻找比标准量小的交换

{

if (*(a + j) < Criterion) //找到进行交换,并跳出。

{

*(a + cnt) = *(a + j);

*(a + j) = Criterion;

cnt = j;

break;

}

}

for (; i < j; i++) //循环自左往右寻找比标准量小的交换

{

if (*(a + i) > Criterion) //找到进行交换,并跳出。

{

*(a + cnt) = *(a + i);

*(a + i) = Criterion;

cnt = i;

break;

}

}

}

if (i != 0) //安排递归条件,递归出口。

{

Quickly_Sort(a, i);

}

if (l - j - 1 != 0)

{

Quickly_Sort(a + i + 1, l - j - 1);

}

}

 

这里以长度为6进行测试。下面看测试输出。

 

 

 

上面为输入数据

下面为输出结果。

OK

(马上就放假了,后面时间就会比较充裕,为大家更新算法,当然自己也是现学现卖,大家共同进步。)

posted @ 2020-01-05 22:14  Mr小明同学  阅读(776)  评论(0编辑  收藏  举报