今天看了快速排序,感觉挺复杂的,可能是还有些只是知识没学到的原因:
我们令右边开头的数为right,左边的为left,右边开始动,直到遇到right<x right停止,轮到left
之后left开始向右移动,直到left>x, 此时进行left和right值的交换
之后再次进行如上,直到right和left二者相等,此时x即等于他们都指着得数
我们会发现此时的x左边的数都是小于x的,而想右边的数都是大于x的
然后我们再对左边进行上面的排序,右边也进行相应的排序,他们是分而治之的,其实这种排序也可以叫做分治排序---------------我们想要都对他们,再次进行这样的排序,我们会想到循环,所以这里就要运用到自我循环的函数------递归函数
关于递归函数,我下面进行一下简单的解释:
递归函数,简单的说就是 递----传递,归----回归
简单的说就是 我们查字典,查到我们想要差的词了,确发现注释里的解释我们又一个不懂,然后我们又开始查这个,然后 查到了却发现这个注释里又有个词不懂,然后我们又开始查-----这就可以说是递,直到最后我查到了,然后开始返回-----也就是归
#include <stdio.h>
#define SIZE 6
//快速排序
void quick_sort(int num[], int low, int high )
{
int i,j,temp;
int tmp;
i = low;
j = high;
tmp = num[low]; //任命为中间分界线,左边比他小,右边比他大,通常第一个元素是基准数
if(i >j) //如果下标i大于下标j,函数结束运行
{
return 0; //return也是可以的
}
while(i != j)
{
while(num[j] >= tmp && j > i)
{
j--;
}
while(num[i] <= tmp && j > i)
{
i++;
}
if(j > i)
{
temp = num[j];
num[j] = num[i];
num[i] = temp;
}
}
num[low] = num[i];
num[i] = tmp;
quick_sort(num,low,i-1);
quick_sort(num,i+1,high);
}
int main(int argc , char **argv)
{
//创建一个数组
int num[SIZE] ={0};
int i;
//输入数字
for(i =0; i < SIZE; i++)
{
scanf("%d",&num[i]);
}
quick_sort(num, 0, SIZE-1);
for(i = 0; i < SIZE; i++)
{
printf(" %d ", num[i]);
}
return 0;
}
我们看向这个代码
quick_sort(num,low,i-1);
quick_sort(num,i+1,high);
这个是当第一次分治结束后,开始后面的分治(也就是左边的进行排序,右边的再进行排序)
这里运用到的就是递归思想,要写两次,是因为左右两边的分治是分开的
i代表着的是num[i];
i代表着的是num[j];
这个是代表着右边的 分治:此时low=i+1,因为当low=high时,此时的x不再参与比较
因此i+1,数组下标low所指的为i+1,即可开始新的一轮分治
quick_sort(num,i+1,high);
这个是代表着左边的 分治:此时high=i-1,因为当low=high时,此时的x不再参与比较
因此i-1,数组下标high所指的为i-1,左侧即可开始新的一轮分治
quick_sort(num,low,i-1);
当i>j时,退出自定义函数,
if(i >j) //如果下标i大于下标j,函数结束运行
{
return 0; //return也是可以的
}
对于常量SIZE的值我们可以进行修改来改变输入数字的个数