快速排序算法
今天算法实验重新学习了快速排序算法,对此有了一些理解,把它记录在此以供日后学习。
如下为快速排序算法 的被调用部分
。
int get_Loc(int arr[],int low,int high)
{
int temp=arr[low];
int i=low;
int j=high;
while(i<j)
{
while(i<j&&arr[j]>=temp)
j--;//队尾元素大于基准值 high指针前移
while(i<j&&arr[i]<=temp)
i++;//队前元素小于基准值 low指针后移
if(i!=j)
{
int x=arr[i];
arr[i]=arr[j];
arr[j]=x;
}
}
arr[low]=arr[i];
arr[i]=temp;
return i; //返回基准位置
}
算法本质是从后往前与从前往后 同时
找到比基准值小和基准值大的数作为一个"对子"
譬如下面例子第一次时
基准值为low值也就是5
所以从后往前 我们找到了2比5小
而从前往后 我们找到了7比5大
所以7和2就是一个对子,我们交换他们即可
实例
比如对于数组arr[]={5,7,1,6,4,8,3,2}
arr[0] | arr[1] | arr[2] | arr[3] | arr[4] | arr[5] | arr[6] | arr[7] |
---|---|---|---|---|---|---|---|
5(low) | 7 | 1 | 6 | 4 | 8 | 3 | 2(high) |
5 | 2 | 1 | 6 | 4 | 8 | 3 | 7 |
5 | 2 | 1 | 3 | 4 | 8 | 6 | 7 |
5 | 2 | 1 | 3 | 4(low,high) | 8 | 6 | 7 |
4 | 2 | 1 | 3 | 5(low,high) | 8 | 6 | 7 |
当high=6 low=3之后
high->8->4(此时4<5成立)
该low继续寻找,此时low->4 停止
因为low已经等于high了
至此 函数第一轮结束 我们交换low,high位与基准位
为什么要先从后往前 再从前往后扫描
譬如 数组为 7 2 8 9 时
如果先从前扫描 会出现 7 2 8 9
这时候的8 为low至此扫描结束 交换7与8变成了8 2 7 9 显然是不对的
如果先从后 就是交换7和2 变成 2 7 8 9 也就队列
下面代码为 调用部分
。
void QuickSort(int arr[],int low,int high)
{
if(low<high)
{
int True_Num=get_Loc(arr,low,high); //找到基准位置
QuickSort(arr,low,True_Num-1); //递归基准前
QuickSort(arr,True_Num+ 1,high); // 递归基准后
}
}
这部分代码很简单 就是说我们进行一轮运算后就把基准值放到了它所应该在的位置所以只需要对基准位之前 与 基准值之后继续重复调用就可以了。
至于算法复杂度等问题 日后再补上。
测试数据:随机生成的十万个数进行排序
测试软件:Dev
测试结果: