常见的五种排序算法

1.直接插入排序

//直接插入排序(从小到大)

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

void insertsort(int a[], int n)
{
    int i, j, tmp;

    for (i = 1; i < n; i++)
    {
        tmp = a[i];                   //记录下当前要插入的元素
        j = i - 1;
        while (j>=0 && tmp < a[j])
        {
            a[j + 1] = a[j];         //若当前要插入的元素比它前面的第j个元素小,则将第j个元素向前移动一个位置
            j--;
        }
        a[j + 1] = tmp;//当判断到最后一个元素或者遇见第一个比tmp小的元素时,跳出循环,将tmp插入到j的下一个位置
    }
}
int main()
{
    int a[10] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
    int i;
    int n = sizeof(a) / sizeof(a[0]);

    printf("排序之前:");
    for (i = 0; i < n; i++)
        printf("%d ", a[i]);

    insertsort(a, n);//调用排序函数

    printf("\n排序之后:");
    for (i = 0; i < n; i++)
        printf("%d ", a[i]);

    system("pause");
    return 0;
}

2.选择排序

//选择排序(从小到大)

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

void selectsort(int a[], int n)
{
    int i, j;
    int min;
    int tmp;

    for (i = 0; i < n-1; i++)
    {
        min = i;            //选出第i趟比较中的最小元素的下标,先假设最小元素的小标为i
        for (j = i + 1; j < n; j++)
        {
            if (a[min]>a[j])
                min = j;
        }
        if (min != i)       //若最小元素的下标改变了,则交换元素,将最小元素放到第i个位置
        {
            tmp = a[min];
            a[min] = a[i];
            a[i] = tmp;
        }
    }
}

int main()
{
    int a[10] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
    int i;
    int n = sizeof(a) / sizeof(a[0]);

    printf("排序之前:");
    for (i = 0; i < n; i++)
        printf("%d ", a[i]);

    selectsort(a, n);//调用排序函数

    printf("\n排序之后:");
    for (i = 0; i < n; i++)
        printf("%d ", a[i]);

    system("pause");
    return 0;
}

3.冒泡排序

//冒泡排序(从小到大)

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

void bubblesort(int a[], int n)
{
    int i, j;
    int tmp;
    for (i = 0; i < n - 1; i++)   //共进行n-1趟比较
    {
        for (j = 0; j< n - 1 - i; j++)  //第i躺比较要进行n-1-i次两两比较
        {
            if (a[j]>a[j + 1])
            {
                tmp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = tmp;
            }
        }
    }
}

int main()
{
    int a[10] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
    int i;
    int n = sizeof(a) / sizeof(a[0]);

    printf("排序之前:");
    for (i = 0; i < n; i++)
        printf("%d ", a[i]);

    bubblesort(a, n);//调用排序函数

    printf("\n排序之后:");
    for (i = 0; i < n; i++)
        printf("%d ", a[i]);

    system("pause");
    return 0;
}

4.希尔排序

//希尔排序(从小到大)

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

void shellsort(int a[], int n)
{
    int i, j;
    int tmp;
    int gap = n;//记录划分的大小
    int flag;

    while (gap >= 1)
    {
        gap = gap / 2;
        do
        {
            flag = 0;
            for (i = 0; i < n - gap; i++)
            {
                j = i + gap;
                if (a[i]>a[j])
                {
                    tmp = a[i];
                    a[i] = a[j];
                    a[j] = tmp;
                    flag = 1;
                }
            }
        } while (flag == 1);
    }
}

int main()
{
    int a[10] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0};
    int i;
    int n = sizeof(a) / sizeof(a[0]);

    printf("排序之前:");
    for (i = 0; i < n; i++)
        printf("%d ", a[i]);

    shellsort(a, n);//调用排序函数

    printf("\n排序之后:");
    for (i = 0; i < n; i++)
        printf("%d ", a[i]);

    system("pause");
    return 0;
}

5.快速排序

//快速排序(从小到大)

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

swap(int *a, int *b)
{
    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
}

void quicksort(int a[], int low, int high)
{
    int i, j;

    if (low < high)
    {
        i = low;
        j = high + 1;
        while(1)
        {
            do
            i++;
            while (!(a[low]<=a[i] || i == high));//从左找到比基准元素a[low]大的第一个数
            do
            j--;
            while (!(a[low] >= a[j] || j == low));//从右找到比基准元素a[low]小的第一个数

            if (i < j)
                swap(&a[i], &a[j]);
            else
                break;
        }
        swap(&a[low], &a[j]);               //j<=i,交换a[low]和a[j]后,基准元素左边的数都不大于基准元素,右边的数都不小于基准元素

        quicksort(a, low, j - 1);           //递归排序基准元素前面的子序列
        quicksort(a, j + 1, high);          //递归排序基准元素后面的子序列
    }
}
int main()
{
    int a[10] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
    int i;
    int n = sizeof(a) / sizeof(a[0]);
    printf("排序之前:");
    for (i = 0; i < n; i++)
        printf("%d ", a[i]);

    quicksort(a,0,n-1);//调用排序函数

    printf("\n排序之后:");
    for (i = 0; i < n; i++)
        printf("%d ", a[i]);

    system("pause");
    return 0;
}
    原文作者:五大常用算法
    原文地址: https://blog.csdn.net/IT_10/article/details/52571393
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞