简单排序算法(一)

来源:互联网 发布:乐乎青年公寓通州北苑 编辑:程序博客网 时间:2024/05/17 22:40

冒泡排序

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

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 0
原创粉丝点击