一些数组排序算法的简单实现(冒泡插入希尔归并和qsort)

Posted 土鳖不土,战斗力五

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一些数组排序算法的简单实现(冒泡插入希尔归并和qsort)相关的知识,希望对你有一定的参考价值。

#include <stdlib.h>
#include <string.h>
#include "sort.h"

//冒泡排序
int bubbleSort(int a[], int n)
{
    int i, j;
    for (i=n-1; i>=0; i--)
    {
        for (j=0; j<i; j++)
        {
            if (a[j]>a[j+1])
            {//交换a[i]和a[j],也可使用临时变量实现
                a[j] += a[j+1];
                a[j+1] = a[j] - a[j+1];
                a[j] = a[j] - a[j+1];
            }
        }
    }
    return 0;
}

/***********编译器自带快排************/
int cmp(const void * a, const void * b)
{
    return *(int *)a - *(int *)b;
}

int quickSortC(int a[], int n)
{
    qsort(a, n, sizeof(a[0]), cmp);
    return 0;
}
/***********编译器自带快排************/


//直接插入排序
int insertSort(int a[], int n)
{
    int i, j, k, tmp;
    for (i=1; i<n; i++)
    {
        for (j=0; j<i; j++)
        {
            if (a[i]<a[j])//insert a[i] before a[j]
            {
                tmp = a[i];
                for (k=i; k>j; k--)
                {
                    a[k] = a[k-1];    
                }
                a[j] = tmp;
            }
        }
    }
    return 0;
}

//希尔排序(无监视哨,迭代,也可递归实现)
int shellSort(int a[], int n)
{
    int i, j, k, tmp, group = 0, step = n/2;
    while (step > 0)
    {
        for (i=group+step; i<n; i+=step)
        {
            tmp = a[i];
            for (j=group; j<i; j+=step)
            {
                if (a[j]>a[i])
                {
                    for (k=i; k>j; k-=step)
                    {
                        a[k] = a[k-step];
                    }
                    a[j] = tmp;
                }
            }
        }
        step /= 2;
    }
    return 0;
}



/*
归并排序,鼓捣了半天,还是写成两个子函数的明了
*/
int merge(int a[], int m, int b[], int n, int arr[])
{
    int i=0, j=0, k=0;
    while (i<m && j<n)
    {
        arr[k++] = a[i]<b[j] ? a[i++] : b[j++];
    }
    if (i<m)
    {
        memcpy(&arr[k], &a[i], (m-i)*sizeof(int));
    }
    else if(j<n)
    {
        memcpy(&arr[k], &b[j], (n-j)*sizeof(int));
    }
    return 0;
}

int mergeSort(int a[], int len)
{
    int i, j, k=0, step, g1, g2, m, n;
    int * arr = (int *)malloc(sizeof(int)*len);
    
    for (step=1; step<=len; step<<=1)
    {//
        g1 = 0;
        g2 = g1 + step;
        k = 0;
        memcpy(arr, a, len*sizeof(int));
        for (i=g1,j=g2; g1<len; g1=g2+step, g2=g1+step)
        {
            //先处理不足两组的情况,即g2>=len的情况
            m = g2<len ? step : len-g1;
            n = g2+step<len ? step : len-g2;
            if (g2>=len)//剩余末尾分组
            {
                memcpy(&a[k], &arr[g1], m*sizeof(int));
                k += m;
                break;
            }
            if(merge(&arr[g1], m, &arr[g2], n, &a[k]))
            {
                free(arr);
                return 1;
            }
            k += m+n;
        }
    }
    free(arr);
    return 0;
}

以上是关于一些数组排序算法的简单实现(冒泡插入希尔归并和qsort)的主要内容,如果未能解决你的问题,请参考以下文章

Python八大算法的实现,插入排序希尔排序冒泡排序快速排序直接选择排序堆排序归并排序基数排序。

js排序算法总结——冒泡,快速,选择,插入,希尔,归并(转载)

常见排序算法的实现(归并排序快速排序堆排序选择排序插入排序希尔排序)

插入排序(直接插入排序希尔排序);交换排序(冒泡排序快速排序);选择排序(简单选择排序堆排序);归并排序和基数排序;基于关键词比较的排序算法下界分析

十大排序算法-快排-希尔-堆排-归并-冒泡-桶排-选择-插入-计数-基数-1

10种经典排序算法的JavaScript实现方法