排序(四)

(2)快速排序

        ***思想

                从待排序记录序列中选取一个记录(通常选取第一个记录)为枢轴,其关键字设为K1,然后将其与关键字小于k1

                的记录移到前面,而将关键字大于或等于k1的记录移到后面,结果将待排序记录序列分成两个子表,最后将关键字

                为k1的记录插入到其分界线的位置处,这个过程称为一趟快速排序。通过一次划分后,就以关键字为k1的记录为界,

                将待排序序列分成了两个子表,且前面子表中的所有记录的关键字均小于k1,而后面子表中的所有记录的关键字均

                大于或等于k1。对分割后的子表继续按上述原则进行分割,直到所有子表的表长不超过1为止,此时待排序记录序列

                就变成了一个有序表。

        ***算法

                //一趟快速排序算法

                int QKPass(RecordType r[],int low,int high)

                {

                        x = r[low];

                        while(low<high)

                        {

                                while(low<high && r[high].key >= x.key)

                                {

                                        high--;

                                }

                                if(low<high)

                                {

                                        r[low] = r[high];

                                        low++;

                                }

                                while(low<high && r[low].key < x.key)

                                {

                                        low++;

                                }

                                if(low<high)

                                {

                                        r[high] = r[low];

                                        high--;

                                }

                        }

                        r[low] = x;

                        return low;

                }

                //完整的快速排序算法

                void QKSort(RecordType r[],int low ,int high)

                {

                        if(low<high)

                        {

                                pos = QKPass(r,low,high);    //调用一趟快速排序,以枢轴元素为界划分两个子表

                                QKSort(r,low,pos-1);        //对左部子表快速排序

                                QKSort(r,pos+1,high);        //对右部子表快速排序

                        }

                }

        ***案例

                #include<stdio.h>
                #include<stdlib.h>
                typedef int KeyType;
                typedef int OtherType;
                typedef struct _RecordType
                {
            KeyType key;
            OtherType other_data;
                }RecordType;
                void BubbleSort(RecordType r[],int n)
                {
            int i,j;
            RecordType x;
            for(i = 1;i<=n-1;i++)
            {
            for(j = 1;j<=n-i;j++)
            {
            if(r[j].key>r[j+1].key)
            {
            x = r[j];
            r[j] = r[j+1];
            r[j+1] = x;
            }
            }
            }
                }
                int main()
                {
                int i;
                int len;
                RecordType r[20];
                printf("请输入数组的长度:\n");
                scanf("%d",&len);
                for(i = 1;i<=len;i++)
                {
                printf("请输入数组中第%d个元素   ",i);
                scanf("%d",&r[i].key);
                }
                printf("\n");
                printf("排序之前的结果:\n");
                for(i = 1;i<=len;i++)
                {
                printf("%d  ",r[i].key);
                }
                printf("\n");
                BubbleSort(r,len);
                printf("排序之后的结果:\n");
                for(i = 1;i<=len;i++)
                {
                printf("%d  ",r[i].key);
                }
                printf("\n");
                return 0;
            }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值