算法之交换排序

   上篇博客我们讲解了算法的插入排序,这篇博客,我们就来说一下交换排序。

   交换排序,顾名思义,就是比较两个记录的键值大小,逆序则交换两个记录的位置。这样键值小的记录向前移动,键值大的记录向序列后部移动。下面我们来说一下交换排序中的冒泡排序和快速排序。

(一)冒泡排序

   因每趟都有一个最大键值的记录沉到序列底部,与气泡从水中往上冒类似而得名。

   我们先来看一下冒泡排序的基本过程:

初始键值序列    45  38  66  90  88  10  25  45

第一趟排序后    38  45  66  88  10  25  45  90

第二趟排序后    38  45  66  10  25  45 88  90

第三趟排序后    38  45  10  25  45  66  88  90

第四趟排序后    38  10  25  45  45  66  88  90

第五趟排序后    10  25  38  45  45  66  88  90

第六趟排序后    10  25  38  45  45  66  88  90

第七趟排序后    10  25  38  45  45  66  88  90


冒泡排序的代码如下:

void BubbleSort (List R,int n){
    int i,j,temp,endsort;
    for(i=1;i<=n-1;i++) //n为序列中记录的个数,循环控制排序的趟数为n-1
     {
        endsort=0; //每次排序前置endsort为0,排序中进行了交换则置为1,循环结束时检查endsort为0则终止循环
        for(i=1;j<=n-j;j++) //循环控制每趟比较的次数,第j趟比较n-j次
          { if(R[j].key>R[j+1].key) //比较相邻元素,若逆序则交换
                {  temp=R[j];
                   R[j]=R[j+1];
                   R[j+1]=temp;
                   endsort=1;
                 }
           }

       if(endsort==0)  break;
      }

}
算法分析:



(二)快速排序

    快速排序是对冒泡排序的一种改进。它的基本思想是:在n个记录中去某一个记录的键值为标准(通常选第1个)通过一趟排序后将n个记录分为不小于这个键值和小于这个键值的两个独立的部分。然后对这两个部分分别进行快速排序,以达到整个序列有序。

快速排序的过程如下:

1.首先设第一个为基准,比较两个数的大小,49不小于49所以不用交换,然后比较27与49的大小,此时27<49,所以27与49交换。

2.27与49交换以后,比较38与49的大小,38<49,所以,继续比较65与49的大小,65>49,所以65与49交换。

3.49与65交换以后,比较65前面的13与49的大小,13<49,所以13与49交换

4.13与49交换以后,比较13后面的97与49的大小,97>49,所以97与49交换

5.97与49交换以后,比较97前面的76与46的大小,76>49,所以不用交换,此时指针重合。第一趟排序结束。

……依此,进行快速排序


快速排序的代码如下:

void quickSort(int s[], int l, int r)  
{  
    if (l< r)  
    {        
        int i = l, j = r, x = s[l];  
        while (i < j)  
        {  
            while(i < j && s[j]>= x) // 从右向左找第一个小于x的数  
                j--;   
            if(i < j)  
                s[i++] = s[j];  
            while(i < j && s[i]< x) // 从左向右找第一个大于等于x的数  
                i++;   
            if(i < j)  
                s[j--] = s[i];  
        }  
        s[i] = x;  
        quickSort(s, l, i - 1); // 递归调用  
        quickSort(s, i + 1, r);  
    }  
}  
算法分析:



评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值