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