快速排序的基本思想是将待排数据分而治之;有点像二叉树的思想,从待排数据中选出一个标杆数将比它小的放在左边,比它大的放在右边。然后再分别对左右边做同样的操作。由上可知,快速排序的算法可用递归的实现;
Void CheckandSort(int Array, int low, int heigh)
{
If (Array == Null || (low >= heigh))
Printf(“输入参数错误”);
Else
Recur(Array, low, heigh);
}
void Recur(int Array[], int low, int heigh)//用low指向线性表的最左端,heigh指//向线性表的最右端;
{
int pivot = 0;
if (low >= heigh)
return;
pivot = Sort(Array, low, heigh);
Recur(Array,low, pivot - 1);
Recur(Array, pivot + 1, heigh);
}
//将数据不停的分段,每分一段用Sort函数进行每段的排序,直到最小段、、//Low >= heigh 返回
int Sort(int Array[], int low, int heigh) //用low指向线性表的最左端,heigh指
//向线性表的最右端;
{
int pivot = Array[low]; //将最左边元素作为标杆数
while(low < heigh)
{
//****************************************************
while (low < heigh && Array[heigh] >= pivot)
heigh--; //从右边遍历找出比标杆数小的数
if (low < heigh)
Array[low++] = Array[heigh];//如果low < heigh将low++将此数放到//low左边
//从最右边遍历(以heigh为指针)将比标杆数小的数移到low左边,low++
while (low < heigh && Array[low] <= pivot)
low++;
if (low < heigh)
Array[heigh--] = Array[low];
//从最右边遍历(以heigh为指针)将比标杆数小的数移到heigh左边,heigh--
}
Array[low] = pivot;//此时low == height正好都指向标杆数位置
return low;
}
//进行每一段的排序
1:关于选取标杆值:一般随机选择标杆值,但是标杆值选择越靠近本组的中间值整个算法效率越高
2:时间复杂度:
1, 首先根据比较的次数若已排好序的数据,用此算法将比较n*(n - 1)/2次;若是每次都能让分组的左右相等,则为n*log2[n]
2, While(low < heigh && Array[low] <= pivot)
low++; 的汇编指令比
if (low < heigh)
Array[heigh--] = Array[low];
少大约3条 故若在移动中不需改变位置的越多速度越快;
故最快的是已排好序切选取的标杆数为数据的中间位置的数;
而最慢的是顺序刚好与待排顺序相反,而选取的标杆值为2端