快速排序思想的变形算法应用

1、题目描述:

设有一组初始记录关键字序列( K1 , K2 ,…, Kn ),要求设计一个算法能够在 O(n) 的时间复杂度内将线性表划分成两部分,其中左半部分的每个关键字均小于 Ki ,右半部分的每个关键字均大于等于 Ki 。

2、算法思想

和快速排序算法的思想是一样的。
1)、选择待排序中的第一个记录作为枢轴,将枢轴记录暂存在数组a【0】的位置,使用 t 保存!附设两个指针,一个是low,指向表的下界,一个是high指向表的上界。初始化 low = 0,high = 数组的表长减1(或者线性表的表长)。
(2)、先从表的最右面的位置使用 high 指针依次向左扫描,找到第一个关键字小于枢轴关键字 t 的记录,则将其移动到 low 所指的的位置。具体操作是,当 low < high 的时候,若 high 所指的关键字大于等于 t ,则向左移指针high(high–);否则将 high 所指记录赋值给low所指的位置,即 a[low]= a[high]!
(3)、然后从先从表的最左面的位置使用 low 指针依次向右扫描(因为在上一步,high移动将第一个关键字小于t的找到并且赋值给了 low 所指的位置 a[low]=a[0],所以相当于 high所指的地方空了,现在需要 low 向右移动找到 大于 t 的关键字将其放到 high 所指的位置),当 low < high的时候,若 low 所指的位置的关键字小于 t ,则直接执行 low ++的操作,否则若是 low 在移动的过程中找到所指的位置的关键字大于 t ,则将其所指位置的关键字赋值给 high 所指的位置,即执行 a[high] = a[low]!
(4)、重复上面的步骤(2)、(3),直到 low = high,此时 low 或者 High 所指的位置即是枢轴 t 在此趟排序中的最终位置,将 t 赋值给 low = high 的位置,以ki为界限原表被分成两个子表!
(5)、最终ki左半部分的每个关键字都小于ki,而右半部分的每一个关键字都大于ki!

3、算法实现

——————————————————————————————————————————————————
#include<stdio.h>
#include<stdlib.h>
void QuickSortChangeForm(int a[],int low,int high){
int ki = a[0];
while(low < high){
while(low < high && a[high] >= ki) high–;
a[low] = a[high];
while(low < high && a[low] <= ki) low++;
a[high] = a[low];
}
a[high] = ki;
}
——————————————————————————————————————————————————
int main(){
int a[10]={12,3,13,22,10,8,45};
QuickSortChangeForm(a,0,6);
int i;
for(i = 0; i < 7;i++){
printf(“%d\t”,a[i]);
}
}
——————————————————————————————————————————————————

在这里插入图片描述

4、算法分析

相比较于快速排序,该方法只是快速排序中执行一次排序的结果!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Q渡劫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值