快速排序法的理解:
假设有一个无需排序的从小到大序列(接下来都是以小到大认为是正确顺序): 1 2 3 4 5
排序的思路其实就是让每个数字归位,那么正确位置具有一个特征,就是这个位置左边的数都比这个位置的数小,右边反之.
比如 2 1 3 5 4 的三就在正确位置.
那么如何做到呢?就是下面的 1-6 步骤是将代码口语化的形式;
首先函数应该有四个参数:a[];low;high;tmp;
把low值给i,high值给j,在选定一个数组中的随机位置给tmp;
1:判断i是否等于j;tmp是否在i至j这个数列中,不成立直接返回; //不能选一个不在数组中的位置
2:把这个tmp位置的值挖空给value; //把这个值拿出来先存起来,接下来找一个正确的正确的位置再在放下这个值.
3:让j循环直到到遇到小于tmp的数,或者直接遇到tmp,再或者或者i=j; //原先tmp位置的右边可能有比小的数
4:如果i!=j就把j的值给tmp这个位置; //把j所指向的值放到了tmp这个坑里,我们还得到了j这个坑,但是i和j之间可能有比value大的数.
5:开始循环直到i=j; //找出在当前坑左边比value数大的值放进这个坑里,然后找出新的坑里右边比value小的数放到这个坑里,如此往复.
循环体为:
i循环到一个不比value小的数或者i=j,如果i不等于j,把i给j;
j循环到一个不比value大的数或者i=j,如果i不等于j,把j给i;
6:把value给i或者j; //直到i=j.确定唯一的坑.放入value.
7:得到左右两个序列分别再递归调用; //在 2 1 3 5 4 假设确定了三 ,我们右得到了 2 1 和 5 4 两个数列,再分别重复之前步骤,就得到了一个递归的使用思路;
8:返回;
这样就可以得到较简单的函数:
结合上文,因为tmp=i=low;
所以这个位置上的数肯定不会大于它本身而且在这个位置的前面没有数字,不就直接可以把这个位置的值拿出来,我们便得到了第一个坑;
当找到第一个比value小的数就可以把这个数放到这个坑里了,因为这个坑左边已经没有数了,也就是没有比value大的数了了;
就比如这个 2 7 3 1 4 -> '' 7 3 1 4 -> 1 7 3 '' 4
那就得到了如下步骤:
1:判断i是否等于j;
2:value= str[tmp];
3:开始循环知道i=j;
循环体为:
j循环到一个不比value大的数或者i=j,如果i不等于j,把j给i;
i循环到一个不比value小的数或者i=j,如果i不等于j,把i给j;
4:得到左右两个序列分别再递归调用; //还是左右两个数列,又得到了一个递归的使用思路;
5:返回
这样做省略了之前 2 3 4 处理第一个坑的步骤;
假设有一个无需排序的从小到大序列(接下来都是以小到大认为是正确顺序): 1 2 3 4 5
排序的思路其实就是让每个数字归位,那么正确位置具有一个特征,就是这个位置左边的数都比这个位置的数小,右边反之.
比如 2 1 3 5 4 的三就在正确位置.
那么如何做到呢?就是下面的 1-6 步骤是将代码口语化的形式;
首先函数应该有四个参数:a[];low;high;tmp;
把low值给i,high值给j,在选定一个数组中的随机位置给tmp;
1:判断i是否等于j;tmp是否在i至j这个数列中,不成立直接返回; //不能选一个不在数组中的位置
2:把这个tmp位置的值挖空给value; //把这个值拿出来先存起来,接下来找一个正确的正确的位置再在放下这个值.
3:让j循环直到到遇到小于tmp的数,或者直接遇到tmp,再或者或者i=j; //原先tmp位置的右边可能有比小的数
4:如果i!=j就把j的值给tmp这个位置; //把j所指向的值放到了tmp这个坑里,我们还得到了j这个坑,但是i和j之间可能有比value大的数.
5:开始循环直到i=j; //找出在当前坑左边比value数大的值放进这个坑里,然后找出新的坑里右边比value小的数放到这个坑里,如此往复.
循环体为:
i循环到一个不比value小的数或者i=j,如果i不等于j,把i给j;
j循环到一个不比value大的数或者i=j,如果i不等于j,把j给i;
6:把value给i或者j; //直到i=j.确定唯一的坑.放入value.
7:得到左右两个序列分别再递归调用; //在 2 1 3 5 4 假设确定了三 ,我们右得到了 2 1 和 5 4 两个数列,再分别重复之前步骤,就得到了一个递归的使用思路;
8:返回;
理解了基本思路后:
当然tmp也可以自动设置只要符合条件一即可;
常见的就是直接把tmp给当前的最小位;这样就可以得到较简单的函数:
结合上文,因为tmp=i=low;
所以这个位置上的数肯定不会大于它本身而且在这个位置的前面没有数字,不就直接可以把这个位置的值拿出来,我们便得到了第一个坑;
当找到第一个比value小的数就可以把这个数放到这个坑里了,因为这个坑左边已经没有数了,也就是没有比value大的数了了;
就比如这个 2 7 3 1 4 -> '' 7 3 1 4 -> 1 7 3 '' 4
那就得到了如下步骤:
1:判断i是否等于j;
2:value= str[tmp];
3:开始循环知道i=j;
循环体为:
j循环到一个不比value大的数或者i=j,如果i不等于j,把j给i;
i循环到一个不比value小的数或者i=j,如果i不等于j,把i给j;
4:得到左右两个序列分别再递归调用; //还是左右两个数列,又得到了一个递归的使用思路;
5:返回
这样做省略了之前 2 3 4 处理第一个坑的步骤;