//快速排序
//流程:用两个哨兵 一个在头一个在尾
//以第一个数为基准数
//一定要尾哨兵先往前寻找比基准数小的 头哨兵往后寻找比基准数大的 寻找到之后再交换 然后继续寻找
//前提是头哨兵一定要小于尾哨兵
//如果两个哨兵指的是同一个位置的数 那么就拿这个数与基准数互换
//然后就基于基准数把原来的数组分成了两部分 然后分别再用这样的方法
//就这样一直分割 到最后就会分成诺干个小数组 然后就用这个方法让他们自己进行排序
//其实最后就是再这个函数里面再套用这个函数
void insert5(int data[],int left,int right)
{
if(left > right)//这一步是关键 如果不写这一步 最后就会无限循环
return ;
int swap = data[left]; //设置基准数
int i = left,j = right; //因为第一次循环之后基准数会变化 所以用i和j代替两个哨兵名称
int t;//用来交换的中间变量
while(i != j) //前提是两个i<j 如果i=j 那么就要进行交换 所以这里直接不等于就好了
{
while( i < j && data[j] > swap) //尾哨兵找比基准数小的
j--; //其实尾哨兵也可以等于基准数 因为再定义的时候基准数可以为任意数
while(i < j && data[i] <= swap) //头哨兵找比基准数大的 头哨兵一开始的位置就在基准数位置上
i++;
if(i < j) //找到相应的位置后进行交换
{
t = data[i];
data[i] = data[j];
data[j] = t;
}
}
data[left] = data[i];//这里注意 要把基准数和两个哨兵都在的这个位置的数互换
data[i] = swap;
insert5(data,left,i-1);//这个就是套用自身了 可见被分成了两个数组(基准数变化的原因)
//分成两个数组之后每个小数组的基准数就发生变化了
insert5(data,i+1,right); //1变2 2变4 4变8 .....这样原数组就会被分成2*n个数组,这样每个小数组再排序的效率就提高了
}
C++快速排序 (个人觉得先把直接插入排序,变种插入排序,折半插入排序,希尔排序都学一下再来学快排)
最新推荐文章于 2024-09-04 21:29:26 发布