快速排序非递归算法
程序员文章站
2022-03-24 13:15:30
...
#define MaxN 1000
typedef int keytype;
void QUICKSORT(keytype K[],int n){
int i,j,left,right,pos=-1;
int buf[MaxN][2];//数组buf用以保存下一趟快拍的起始和末尾位置
keytype temp;
while(1){/*K[left]为分界元素*/
i = left;
j = right;
while(1){ //每一次排序从这里开始
do i++; while(i!= right && K[i]<K[left]);
do j--; while(j!= left && K[j]>K[left]);
if (i<j)
{
temp = K[i];
K[i] = K[j];
K[j] = temp; //以上三条交换K[i]与K[j]的内容
}else{
break;
}
}
temp = K[left];
K[left] = K[i];
K[i] = temp; //交换K[left]与K[i]的内容
if (j+1>=right && j-1<=left)//被分成两部分都不足两个元素
{
if (pos == -1)
{
break; //保存排序首,尾位置的数组为空,排序结束
}
left = buf[pos][0];//获取新的排序范围的起始位置
right = buf[pos--][1];//获取新的排序范围的末尾位置
}else{
if (j+1<right && j-1 > left)//若前后两部分都超过一个元素
{
buf[++pos][0] = j+1;
buf[pos][1] = right; //保存排序后边部分的首尾位置
right = j-1;
}
else if (j+1>=right)//若只有被分成的前部分只有一个元素
{
right = j-1;
}else{ //若只有被分成的后部分只有一个元素
left = j+1;
}
}
}
}
上一篇: mysql 之库, 表的简易操作