欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

快速排序非递归算法

程序员文章站 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;
			}
		}

	}
}
相关标签: 快排 非递归