常见排序总结

本文详细介绍了八种常见的排序算法:冒泡排序、快速排序、计数排序、插入排序、选择排序、希尔排序、归并排序、鸡尾酒排序和桶排序,并提供了每种排序算法的C语言实现。通过这些实例,读者可以深入理解各种排序算法的工作原理和效率特点。

冒泡

#include <stdio.h>

void bubble_sort(int array[], int length);

void bubble_sort(int array[], int length)
{
    int i, j, temp;

    for (i = 0; i < length - 1; i++)
    {
        for (j = 0; j < length - 1 - i; j++)
        {
            if (array[j] > array[j + 1])
            {
                temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
            }
        }
    }
}

int main(void)
{
    int array[] = { 73, 108, 111, 118, 101, 70, 105, 115, 104, 67, 46, 99, 111, 109 };
    int i, length;

    length = sizeof(array) / sizeof(array[0]);
    bubble_sort(array, length);

    printf("排序后的结果是:");
    for (i = 0; i < length; i++)
    {
        printf("%d ", array[i]);
    }
    putchar('\n');

    return 0;
}

快排

#include <stdio.h>

void quick_sort(int array[], int left, int right);

void quick_sort(int array[], int left, int right)
{
    int i = left, j = right;
    int temp;
    int pivot;

    // 基准点设置为中间元素,你也可以选择其它元素作为基准点
    pivot = array[(left + right) / 2];

    while (i <= j)
    {
        // 找到左边大于等于基准点的元素
        while (array[i] < pivot)
        {
            i++;
        }
        // 找到右边小于等于基准点的元素
        while (array[j] > pivot)
        {
            j--;
        }
        // 如果左边下标小于右边,则互换元素
        if (i <= j)
        {
            temp = array[i];
            array[i] = array[j];
            array[j] = temp;
            i++;
            j--;
        }
    }

    if (left < j)
    {
        quick_sort(array, left, j);
    }

    if (i < right)
    {
        quick_sort(array, i, right);
    }
}

int main(void)
{
    int array[] = { 73, 108, 111, 118, 101, 70, 105, 115, 104, 67, 46, 99, 111, 109 };
    int i, length;

    length = sizeof(array) / sizeof(array[0]);
    quick_sort(array, 0, length - 1);

    printf("排序后的结果是:");
    for (i = 0; i < length; i++)
    {
        printf("%d ", array[i]);
    }
    putchar('\n');

    return 0;
}

在这里插入图片描述

计数排序:

#include <stdio.h>
#include <stdlib.h>

void counting_sort(int array[], int length);

void counting_sort(int array[], int length)
{
    int i, max;
    int* buffer = NULL;
    int* sorted = NULL;

    max = array[0];
    for (i = 1; i < length; i++)
    {
        if (array[i] > max)
        {
            max = array[i];
        }
    }

    buffer = (int*)malloc((max + 1) * sizeof(int));
    for (i = 0; i < max + 1; i++)
    {
        buffer[i] = 0;
    }

    for (i = 0; i < length; i++)
    {
        buffer[array[i]]++;
    }

    for (i = 1; i < max + 1; i++)
    {
        buffer[i] += buffer[i - 1];
    }

    sorted = (int*)malloc(length * sizeof(int));
    for (i = length; i > 0; i--)
    {
        sorted[--buffer[array[i - 1]]] = array[i - 1];
    }

    for (i = 0; i < length; i++)
    {
        array[i] = sorted[i];
    }

    free(buffer);
    free(sorted);
}

int main(void)
{
    int array[] = { 73, 108, 111, 118, 101, 70, 105, 115, 104, 67, 46, 99, 111, 109 };
    int i, length;

    length = sizeof(array) / sizeof(array[0]);
    counting_sort(array, length);

    printf("排序后的结果是:");
    for (i = 0; i < length; i++)
    {
        printf("%d ", array[i]);
    }
    putchar('\n');

    return 0;
}

在这里插入图片描述

插入排序

#include <stdio.h>

void insertion_sort(int array[], int length);

void insertion_sort(int array[], int length)
{
    int i, j, temp;

    for (i = 1; i < length; i++)
    {
        temp = array[i];
        j = i - 1;
        for (; j >= 0 && array[j] > temp; j--)
        {
            array[j + 1] = array[j];
        }
        array[j + 1] = temp;
    }
}

int main(void)
{
    int array[] = { 73, 108, 111, 118, 101, 70, 105, 115, 104, 67, 46, 99, 111, 109 };
    int i, length;

    length = sizeof(array) / sizeof(array[0]);
    insertion_sort(array, length);

    printf("排序后的结果是:");
    for (i = 0; i < length; i++)
    {
        printf("%d ", array[i]);
    }
    putchar('\n');

    return 0;
}

选择排序

#include <stdio.h>

void selection_sort(int array[], int length);

void selection_sort(int array[], int length)
{
    int i, j, min, temp;

    for (i = 0; i < length - 1; i++)
    {
        min = i;
        for (j = i + 1; j < length; j++)
        {
            if (array[min] > array[j])
            {
                min = j;
            }
        }
        temp = array[min];
        array[min] = array[i];
        array[i] = temp;
    }
}

int main(void)
{
    int array[] = { 73, 108, 111, 118, 101, 70, 105, 115, 104, 67, 46, 99, 111, 109 };
    int i, length;

    length = sizeof(array) / sizeof(array[0]);
    selection_sort(array, length);

    printf("排序后的结果是:");
    for (i = 0; i < length; i++)
    {
        printf("%d ", array[i]);
    }
    putchar('\n');

    return 0;
}

希尔排序

#include <stdio.h>

void shell_sort(int array[], int length);

void shell_sort(int array[], int length)
{
    int i, j, step, temp;

    for (step = length / 2; step > 0; step /= 2)
    {
        for (i = step; i < length; i++)
        {
            temp = array[i];
            for (j = i - step; j >= 0 && array[j] > temp; j -= step)
            {
                array[j + step] = array[j];
            }
            array[j + step] = temp;
        }
    }
}

int main(void)
{
    int array[] = { 73, 108, 111, 118, 101, 70, 105, 115, 104, 67, 46, 99, 111, 109 };
    int i, length;

    length = sizeof(array) / sizeof(array[0]);
    shell_sort(array, length);

    printf("排序后的结果是:");
    for (i = 0; i < length; i++)
    {
        printf("%d ", array[i]);
    }
    putchar('\n');

    return 0;
}

归并排序

#include <stdio.h>

void merge_sort(int array[], int length);
void merge_sort_recursive(int array[], int reg[], int start, int end);

void merge_sort_recursive(int array[], int reg[], int start, int end)
{
    if (start >= end)
    {
        return;
    }

    int k = start;
    int length = end - start;
    int mid = (length / 2) + start;
    int start1 = start, end1 = mid;
    int start2 = mid + 1, end2 = end;

    merge_sort_recursive(array, reg, start1, end1);
    merge_sort_recursive(array, reg, start2, end2);

    while (start1 <= end1 && start2 <= end2)
    {
        reg[k++] = array[start1] < array[start2] ? array[start1++] : array[start2++];
    }

    while (start1 <= end1)
    {
        reg[k++] = array[start1++];
    }

    while (start2 <= end2)
    {
        reg[k++] = array[start2++];
    }

    for (k = start; k <= end; k++)
    {
        array[k] = reg[k];
    }
}

void merge_sort(int array[], int length)
{
    int reg[14];
    merge_sort_recursive(array, reg, 0, length - 1);
}

int main(void)
{
    int array[] = { 73, 108, 111, 118, 101, 70, 105, 115, 104, 67, 46, 99, 111, 109 };
    int i, length;

    length = sizeof(array) / sizeof(array[0]);
    merge_sort(array, length);

    printf("排序后的结果是:");
    for (i = 0; i < length; i++)
    {
        printf("%d ", array[i]);
    }
    putchar('\n');

    return 0;
}

在这里插入图片描述

鸡尾酒排序

#include <stdio.h>

void cocktail_sort(int array[], int length);

void cocktail_sort(int array[], int length)
{
    int i, left = 0, right = length - 1;
    int temp;

    while (left < right)
    {
        for (i = left; i < right; i++)
        {
            if (array[i] > array[i + 1])
            {
                temp = array[i];
                array[i] = array[i + 1];
                array[i + 1] = temp;
            }
        }
        right--;
        for (i = right; i > left; i--)
        {
            if (array[i - 1] > array[i])
            {
                temp = array[i];
                array[i] = array[i - 1];
                array[i - 1] = temp;
            }
        }
        left++;
    }
}

int main(void)
{
    int array[] = { 73, 108, 111, 118, 101, 70, 105, 115, 104, 67, 46, 99, 111, 109 };
    int i, length;

    length = sizeof(array) / sizeof(array[0]);
    cocktail_sort(array, length);

    printf("排序后的结果是:");
    for (i = 0; i < length; i++)
    {
        printf("%d ", array[i]);
    }
    putchar('\n');

    return 0;
}

在这里插入图片描述

桶排序

#include <stdio.h>
#include <stdlib.h>

int* add_item(int* array, int count, int item);
void bucket_sort(int array[], int length);

struct Bucket
{
    int* data;
    int count;
};

int* add_item(int* array, int count, int item)
{
    int* newArray = (int*)malloc(sizeof(int) * (count + 1));
    int i;

    for (i = 0; i < count; i++)
    {
        newArray[i] = array[i];
    }

    newArray[count] = item;

    return newArray;
}

void bucket_sort(int array[], int length)
{
    int min = array[0];
    int max = array[0];
    int i, j, k, cap, size;
    struct Bucket* bucket = NULL;
    struct Bucket b;

    for (i = 1; i < length; i++)
    {
        if (array[i] > max)
        {
            max = array[i];
        }

        if (array[i] < min)
        {
            min = array[i];
        }
    }

    cap = max - min + 1;
    bucket = (struct Bucket*)malloc(sizeof(struct Bucket) * cap);

    for (i = 0; i < cap; i++)
    {
        bucket[i] = *(struct Bucket*)malloc(sizeof(struct Bucket));
    }

    for (i = 0; i < length; i++)
    {
        b = bucket[array[i] - min];
        if (b.count < 0)
        {
            b.count = 0;
        }

        bucket[array[i] - min].data = add_item(b.data, b.count++, array[i]);
        bucket[array[i] - min].count = b.count;
    }

    for (i = 0, k = 0; i < cap; i++)
    {
        size = bucket[i].count;

        if (size > 0)
        {
            for (j = 0; j < size; j++)
            {
                array[k] = bucket[i].data[j];
                k++;
            }
        }
    }
}

int main(void)
{
    int array[] = { 73, 108, 111, 118, 101, 70, 105, 115, 104, 67, 46, 99, 111, 109 };
    int i, length;

    length = sizeof(array) / sizeof(array[0]);
    bucket_sort(array, length);

    printf("排序后的结果是:");
    for (i = 0; i < length; i++)
    {
        printf("%d ", array[i]);
    }
    putchar('\n');

    return 0;
}

在这里插入图片描述

心形 图案

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define I 20
#define R 340
int main()
{
    int i, j, e;
    int a;
    long time;
    system("title 寻梦SSS");
    for (i = 1, a = I; i < I / 2; i++, a--)
    {
        for (j = (int)(I - sqrt(I * I - (a - i) * (a - i))); j > 0; j--)
            printf(" ");
        for (e = 1; e <= 2 * sqrt(I * I - (a - i) * (a - i)); e++)
            printf("\3");
        for (j = (int)
            (2 * (I - sqrt(I * I - (a - i) * (a - i)))); j > 0; j--)
            printf(" ");
        for (e = 1; e <= 2 * sqrt(I * I - (a - i) * (a - i)); e++)
            printf("\3");
        printf("\n");
    }
    for (i = 1; i < 80; i++)
    {
        if (i == 25)
        {
            printf(" 一路向前冲冲冲!!!!!!!");
            i += 30;
        }
        printf("\3");
    }
    printf("\n");
    for (i = 1; i <= R / 2; i++)
    {
        if (i % 2 || i % 3)
            continue;
        for (j = (int)(R - sqrt(R * R - i * i)); j > 0; j--)
            printf(" ");
        for (e = 1; e <= 2 * (sqrt(R * R - i * i) - (R - 2 * I)); e++)
            printf("\3");
        printf("\n");
    }

    for (; ; )
    {
        system("color a");
        for (time = 0; time < 99999999; time++); system("color b");
        for (time = 0; time < 99999999; time++); system("color c");
        for (time = 0; time < 99999999; time++); system("color d");
        for (time = 0; time < 99999999; time++); system("color e");
        for (time = 0; time < 99999999; time++); system("color f");
        for (time = 0; time < 99999999; time++);
        system("color 0"); for (time = 0; time < 99999999; time++);
        system("color 1"); for (time = 0; time < 99999999; time++);
        system("color 2"); for (time = 0; time < 99999999; time++);
        system("color 3"); for (time = 0; time < 99999999; time++);
        system("color 4");
        for (time = 0; time < 99999999; time++); system("color 5");
        for (time = 0; time < 99999999; time++); system("color 6");
        for (time = 0; time < 99999999; time++); system("color 7");
        for (time = 0; time < 99999999; time++); system("color 8");
        for (time = 0; time < 99999999; time++); system("color 9");
        for (time = 0; time < 99999999; time++); system("color ab");
        for (time = 0; time < 99999999; time++); system("color ac");
        for (time = 0; time < 99999999; time++); system("color ad");
        for (time = 0; time < 99999999; time++); system("color ae");
        for (time = 0; time < 99999999; time++); system("color af");
        for (time = 0; time < 99999999; time++);
    }
    return 0;
}

在这里插入图片描述

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寻梦&之璐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值