/*快速排序 平均时间复杂度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;
}
它是对冒泡算法的一种改进,不仅仅是相邻间的位置进行,比较次数和移动次数比较少
快速排序也称为分区交换排序:初始化基准,然后右侧开始扫描,左侧再扫描,然后递归重复执行;
*/
//快速排序算法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;
}