复杂代码的设计书写
先设计好思路,然后一部写,可从关键步骤写---程序先要设计好走的思路对于复杂部分才可以写出
功能组件---(函数中的代码可以按照功能组件抽象)可以打的步骤写好之后再完善,先可以一个名字代替,
设计好思路后划分功能组件一个组件一个组件的去完善代码
对于初步设计代码中出现的问题,分析造成代码问题的根本原因,然后修改程序设计,
1,从根本原因解决
快速排序的思路就是从根本原因解决,由于值交换之后值的位置不能锁定---》如果值能根据比较的当前的下标关联就好---》换到的位置的下标是循环中用的下标---》
在用现在的下标去比较--记录被比较下标移动时自动关联,交换时自动有--->反方向即可实现下标和标准值的关联----》由于一个新问题到底是低位还是高位---》由于
比较次数的基偶性不确定---》可不可以保持一直是偶数---》基数*2---》每次遍历一次大的里有两次小的遍历第二次反方向遍历
2,对问题的弥补
1,以数组的第一个为基础分左右大小类
2,左右类在以各自的第一个为基础在排序分左右大小类
3,都是在一个数组上操作,基准好了就不再排了
4,下一次的位置基准是排好后的这个基准
5,换位置,一个一个和其比较小的放左边,大的放右边(按序号比不能漏)===这种思路需要记录标注位置,采用弥补的方式用另一个变量存下也可
如下代码是从根本的思路解决:
private int partition(int low,int high,int pivot){
while(low<high){
//左右交替进行,从右边交换了一次下次就从左边交换,左右双向交替确保1,完全遍历完,2保证当下的低位始终是标准的下标
//只往一边移动很难记录标准的最终位置
while(low<high &&array[high]>=pivot){ //从右端开始扫描,定位到第一个比pivot小的元素
high--;
}
swap(low,high);//只是換元素,标准元素落在swap中的高位或低位
while(low<high &&array[low]<=pivot){ //从左端开始扫描,定位到第一个比pivot大的元素
low++;
}
swap(low,high); //等于的时候就自己和自己交换
}
return low;
}
/**
* 递归的快速排序
*@param low 数组的最小下标
*@param high 数组的最大下标
*/
private void recursiveQuikSort(int low,int high){
if(low>=high){
return;
}else{
int pivot = array[low]; //以第一个元素为基准
int partition =partition(low,high,pivot); //对数组进行划分,比pivot小的元素在低位段,比pivot大的元素在高位段
display();
recursiveQuikSort(low,partition-1); //对划分后的低位段进行快速排序
recursiveQuikSort(partition+1,high); //对划分后的高位段进行快速排序
}
参考:
https://blog.csdn.net/u012152619/article/details/47379295