简单排序算法(一)

冒泡排序

冒泡应该是我们学过的最简单的算法了。它的原理很简单,以升序为例:从左到右,逐个比较,如果左边比右边大则交换,这样一次遍历之后选出一个最大的,再重复此操作。示例代码如下:

void bubblesort(int n,int data[]){  //n为数组的大小       
    int i,j,tem;
    for(i=0;i<n;i++)
    for(j=0;j<n-1;j++)
    if(data[j]>data[j+1]){
        tem=data[j];
        data[j]=data[j+1];
        data[j+1]=tem;
    }
} 

快速排序

快排不是一个稳定的排序算法–即多个相同的值在排序结束后相对位置会发生变化。算法思路:先选取一个数据(通常是数组的第一个)作为关键值(key),从数组的两头向中间遍历,先从右边找一个比key小的移到左边,再从左边找一个比key大的移到右边。这样,一次完整的遍历之后,key的左边全是比它小的数,key的右边全是比它大的数。即,数值key的位置已经确定了。只需要分别对它的左右两部分用同样的方法进行排序。

void quicksort(int L,int r,int data[]){  //L,r为待排序数组左右两端的下标
    int i,j,tem;
    i=L;j=r;tem=data[L];  //取数组的第一个值作为key值
    if(L>=r) return;
    while(i<j){    //i=j时该次遍历结束
        while(i<j&&data[j]>=tem) j--;  //找到一个比key值小的
        data[i]=data[j];
        while(i<j&&data[i]<=tem) i++;  //找到一个比key值大的
        data[j]=data[i];
    }
    data[i]=tem;  //该次遍历结束后将key值位置已经确定。
    quicksort(L,i-1,data); //分别对左边、右边的部分用同样的方法进行排序
    quicksort(i+1,r,data);
}

归并排序

归并排序的中心思想是二路归并。即将两个有序序列合并成一个有序序列。归并排序利用递归来实现,先从上到下分组,再从下到上归并。如图:这里写图片描述
这里写图片描述

void mergsort(int L,int r,int data[]){      
    int i,j,mid,p;
    static int tem[data_size];   //申请一个和数组同样大小的数据空间
     if(L==r) return;
    mid=(L+r)/2;
    i=L;j=mid+1;p=L;
    mergsort(L,mid,data);   //分组排序       
    mergsort(mid+1,r,data);        

    while(i<=mid||j<=r)  {   //将2个有序序列归并为一个
        if(i>mid) { 
        tem[p++]=data[j++];
        continue;
        }
        if(j>r){
            tem[p++]=data[i++];
            continue;
        }
        if(data[i]<data[j]) tem[p++]=data[i++];
        else tem[p++]=data[j++];
    }
    for(i=L;i<=r;i++) data[i]=tem[i];
} 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值