快速排序

/*快速排序  平均时间复杂度O(n*lgn/lg2)  最差O(n^2)


  
它是对冒泡算法的一种改进,不仅仅是相邻间的位置进行,比较次数和移动次数比较少

 快速排序也称为分区交换排序:初始化基准,然后右侧开始扫描,左侧再扫描,然后递归重复执行;
 
*/


//快速排序算法QuickSort


void QuickSort(SeqList R,int low, int high)//对R[low...high]快速排序
{
int pivotpos;  //划分后的基准记录的位置
if (low<high)   //仅当区间长度大于1时才要排序
{
pivotpos = partition(R,low,high);
//对R[low..high]做划分
QuickSort(R,low,pivotpos-1);//对左区间递归排序
QuickSort(R,pivotpos+1,high);//对右区间递归排序
}
}


//划分算法
int Partition(SelList R,int i, int j)//调用Partition(R,low,high)时,对R[low,high]做划分并返回基准记录的位置
{

ReceType  pivot=R[i];  //用区间的第一条记录作为基准
while (i<j)//从区间两端交替向中间扫描,知道i=j为止
{
while (i <j && R[j].key >= pivot.key)
j--;  //从右向左扫描,查找第1个关键字小于pivot.key的记录R[j];

if (i <j)
R[i++] = R[j]; //交换R[i]和R[j]的值

while (i<j && R[i].key <= pivot.key)此时pivot相当于在位置j上
{
i++;   //从左向右扫描,查找第一个关键字大于pivot.key的R[i];
}
if (i<j)
R[j--] = R[i];//交换值

}

R[i] = pivot; //基准记录已被最后定位
return i;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值