美文网首页
基本排序(C语言实现)

基本排序(C语言实现)

作者: 十二找十三 | 来源:发表于2019-05-27 14:55 被阅读0次
#include <stdio.h>
#include <stdlib.h>

void bubble_sort(int a[], int len);// 冒泡 

void insertion_sort(int a[], int len);// 插入

void shell_sort(int a[], int len);// 希尔

void selection_sort(int a[], int len);// 选择

void quick_sort(int a[], int sIndex, int eIndex);// 快速排序(单边)

void merge_sort_top_down(int a[], int sIndex, int eIndex);// 归并 从上往下

void merge_sort_bottom_up(int a[], int len);// 归并 从下往上

void bucket_sort(int a[], int len, int max);// 桶排序

void radix_sort_LSD(int a[], int len);// 基数排序LSD

int main(int argc, char const *argv[])
{
    int a[] = {6, 5, 3, 1, 2, 4};
    int len = sizeof(a) / sizeof(a[0]);


    // bubble_sort(a, len);
    // insertion_sort(a, len);
    // shell_sort(a, len);
    // selection_sort(a, len);
    // quick_sort(a, 0, len - 1);
    // merge_sort_top_down(a, 0, len - 1);
    // merge_sort_bottom_up(a, len);
    // bucket_sort(a, len, 7);// Max Win(数组长度 pk 元素最大值) + 1
    // radix_sort_LSD(a, len);

    for (int i = 0; i < len; ++i)
    {
        printf("%d\n", a[i]);
    }

    return 0;
}


void bubble_sort(int a[], int len)
{
    int i, j, temp, jCount, iCount = len - 1;
    for (i = 0; i < iCount; ++i)
    {
        for (j = 0, jCount = iCount - i; j < jCount; ++j)
        {
            if (a[j] > a[j + 1])
            {
                temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }            
        }
    }
}


void insertion_sort(int a[], int len)
{
    int i, j, temp;
    for (i = 1; i < len; ++i)
    {
        temp = a[i];
        j = i - 1;
        while (j >= 0 && temp < a[j])
        {
            a[j + 1] = a[j];
            j--;
        }
        a[j + 1] = temp;
    }
}


void shell_sort(int a[], int len)
{
    int i, j, temp, gap;
    for (gap = len >> 1; gap > 0; gap = gap >> 1)
    {
        for (i = gap; i < len; ++i)
        {
            temp = a[i];
            for (j = i - gap; j >= 0 && temp < a[j]; j = j - gap)
            {
                a[j + gap] = a[j];
            }
            a[j + gap] = temp;
        }
    }
}


void selection_sort(int a[], int len)
{
    int i, j, temp, minIndex, iCount = len  - 1;

    for (i = 0; i < iCount; ++i)
    {
        minIndex = i;
        for (j = i + 1; j < len; ++j)
        {
            if (a[j] < a[minIndex])
            {
                minIndex = j;
            }
        }

        if (minIndex != i)
        {
            temp = a[i];
            a[i] = a[minIndex];
            a[minIndex] = temp;
        }
    }
}


void quick_sort(int a[], int sIndex, int eIndex)
{
    if (sIndex >= eIndex)
    {
        return;
    }

    int i = sIndex - 1, j = sIndex, baseValue = a[eIndex];
    while (j < eIndex)
    {
        if (baseValue >= a[j])
        {
            int temp = a[j];
            a[j] = a[i + 1];
            a[i + 1] = temp;

            i++;
            j++;
        } 
        else
        {
            j++;
        }
    }

    a[eIndex] = a[i + 1];
    a[i + 1] = baseValue;

    quick_sort(a, sIndex, i);
    quick_sort(a, i + 2, eIndex);
}


void merge(int a[], int sIndex, int eIndex, int mid)
{
    int arrayTemp[eIndex - sIndex + 1];

    int i = sIndex, j = mid + 1, k = 0;
    while (1) 
    {
        if (i <= mid && j <= eIndex) 
        {
            if (a[i] <= a[j])
            {
                arrayTemp[k] = a[i];
                i++;
            } 
            else 
            {
                arrayTemp[k] = a[j];
                j++;
            }
            k++;
        } 
        else if (i > mid && j <= eIndex) 
        {
            arrayTemp[k] = a[j];
            j++;
            k++;
        } 
        else if (i <= mid && j > eIndex) 
        {
            arrayTemp[k] = a[i];
            i++;
            k++;
        } 
        else 
        {
            break;
        }
    }

    for (int m = 0; m < k; ++m)
    {
        a[sIndex + m] = arrayTemp[m];
    }
}


void merge_sort_top_down(int a[], int sIndex, int eIndex)
{
    if (sIndex >= eIndex)
    {
        return;
    }
    
    int mid = (sIndex + eIndex) / 2;
    merge_sort_top_down(a, sIndex, mid);
    merge_sort_top_down(a, mid + 1, eIndex);

    merge(a, sIndex, eIndex, mid);
}

void merge_sort_buttom_up(int a[], int len)
{
    int gap, i;
    for (gap = 1; gap < len; gap *= 2)
    {
        for(i = 0; i + 2 * gap - 1 < len; i += 2 * gap)
        {
            merge(a, i, i + 2 * gap - 1, i + gap - 1);
        }
    }
    merge(a, 0, len - 1, len >> 1);
}

void bucket_sort(int a[], int len, int max)
{
    int i, j;
    int *buckets;

    if (a == NULL || len < 1 || max < 1)
    {
        return ;
    }

    // 辅助空间
    buckets = (int *) calloc(max, sizeof(int));

    // 1. 计数 
    for(i = 0; i < len; i++) 
    {
        buckets[a[i]]++; 
    }

    // 2. 排序     i:辅助空间数组下标也是待排序数组值    j:待排序数组下标
    for (i = 0, j = 0; i < max; i++) 
    {
        while((buckets[i]--) > 0)
        {
            a[j++] = i;
        }
    }

    free(buckets);// 释放辅助空间内存
}

int get_max(int a[], int n)
{
    int i, max;

    max = a[0];
    for (i = 1; i < n; i++)
    {
        if (a[i] > max)
        {
            max = a[i];
        }
    }    
    return max;
}

void radix_sort_LSD_core(int a[], int len, int exp)
{
    int i, j, aIndex = 0, buckets[10][len];
    int tag[10] = {0};

    for (i = 0; i < len; ++i)
    {
        int tempValue = a[i] / exp % 10;
        buckets[tempValue][tag[tempValue]++] = a[i];
    }

    for (i = 0; i < 10; ++i)
    {
        for (j = 0; j < tag[i]; ++j)
        {
            a[aIndex++] = buckets[i][j];
        }
    }
}

void radix_sort_LSD(int a[], int len)
{
    int max = get_max(a, len);
    int exp;
    for (exp = 1; max / exp > 0; exp *= 10)
    {
        radix_sort_LSD_core(a, len, exp);
    }
}

相关文章

网友评论

      本文标题:基本排序(C语言实现)

      本文链接:https://www.haomeiwen.com/subject/psjhtctx.html