数据结构之排序算法(四)

前面说了不少的排序算法了,今天有从书上看到了两个排序算法,这里准备把它们记录下来。今天写的两个排序算法是归并排序和基数排序

1、归并排序
在使用归并排序时,将两个或两个以上的有序表合并成一个新的有序表。假设初始序列含有 k 个记录,首先将 k 个记录看成 k 个有序的子序列,每个子序列的长度为1,然后两两进行归并,如此重复下去,直到长度为 k 为止,上述称为二路归并。

基本步骤:
①:将当前区间一分为二,求分裂点
②:递归地对两个子区间进行归并排序
③:将排好序的子区间归并为一个有序的区间
④:区间长度为1,递归条件终结

相关代码:

void merge(int a[], int start, int mid, int end) {
    int n1 = mid - start + 1;
    int n2 = end - mid;
    int left[n1], right[n2];

    // copy element
    for (int i = 0; i < n1; ++i)
        left[i] = a[start + i];
    for (int j = 0; j < n2; ++j)
        right[j] = a[mid + j + 1];

    int i = 0, j = 0, k = start;
    // compare left and right element, then decide which is big
    while (i < n1 && j < n2) {
        if (left[i] < right[j])
            a[k++] = left[i++];
        else
            a[k++] = right[j++];
    }
    // copy element leave
    // left[] is not exhausted
    while (i < n1)
        a[k++] = left[i++];
    // right[] is not exhausted
    while (j < n2)
        a[k++] = right[j++];
}

void mergeSort(int a[], int start, int end) {
    int mid;
    if (start < end) {
        mid = (start + end) / 2;
        mergeSort(a, start, mid);
        mergeSort(a, mid + 1, end);
        merge(a, start, mid, end);
    }
}

2、基数排序
前面的各种排序方法基本操作是比较和交换,而基数排序则利用分配和收集这两种基本操作。

基本思想:排序时先按照最低位的值对记录进行初步排序,在此基础上再按次低位的值进行进一步排序。依此类推,直至最高位。

#include<stdio.h>  
typedef struct  
{  
  int num;  
  int next;  
}slcell;         //静态链表的结点类型  
#define M 11  
int f[M];  
int e[M];  
int head=0;  
void distribute(slcell *a,int w)  
{  
  int i;  
  int last;  
  for(i=0;i<10;i++)  
   f[i]=-1;  
  for(i=head;i!=-1;i=a[i].next)  
  {  
    last=(a[i].num/w)%10;  
    if(f[last]==-1)  
 f[last]=i;  
 else  
 a[e[last]].next=i;  

 e[last]=i;  
  }  

}              //某一次排序  
void collect(slcell *a)  
{  
  int i;  
  int l = -1;  
    for (i=0; i<10; i++)  
        if (f[i] != -1)  
  {  
            if (l == -1)  
                head = f[i];  
            else  
                a[l].next = f[i];  
                l = e[i];  
        }  
 a[l].next = -1;  
}                   //将排序好的数组恢复成静态链表  
void Output(slcell *a, int head)  
{  
    while (head != -1) {  
        printf("%4d", a[head].num);  
        head = a[head].next;  
    }  
    printf("n");  
}                        //输出静态链表中的值  
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值