我也还在学, 慢慢更新嘿嘿

1、冒泡排序

冒泡排序是指每一次遍历时都将最大的数放置在最后面,像一个气泡浮到了水面,故称冒泡排序

for (int i = 0; i < n; i++)
{
	for (int j = 0; j < n - i - 1; j++)
	{
		if (a[j] > a[j + 1])
		{
			int tmp = a[j];
			a[j] = a[j + 1];
			a[j + 1] = tmp;
		}
	}
}

2、选择排序

选择排序是每一次遍历(第n次)都将最大(最小)的数与第n位的数对调,达到排序的目的

#include<stdio.h>

void InsertSort(int*, int);
int findMin(int*, int, int);
void outputData(int*, int);


int main()
{
    int n;
    scanf("%d", &n);
    int a[n];
    int i;
    for (i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    InsertSort(a, n);
    return 0;
}

void InsertSort(int a[],int n)
{
    int i;
    for (i = 0; i < n - 1; i++)
    {
        int tmp = a[i];
        int min = findMin(a, i, n);
        a[i] = a[min];
        a[min] = tmp;
        outputData(a, n);
    }
}

int findMin(int data[], int startLoc, int endLoc)
{
    int i, xiabiao = startLoc;
    int min = data[startLoc];
    for (i = startLoc; i < endLoc; i++)
    {
        if (data[i] < min)
        {
            min = data[i];
            xiabiao = i;
        }
    }
    return xiabiao;
}

void outputData(int data[],int elementCount)
{
    int i = 0;
    for (i = 0; i < elementCount; i++)
    {
        printf("%d ", data[i]);
    }
    printf("\n");
}

3、插入排序

插入排序算法描述如下:
初始序列:49 38 65 97 76 13 27 49
将元素(38) 插入合适位置: [38 49] 65 97 76 13 27 49
将元素(65) 插入合适位置: [38 49 65] 97 76 13 27 49
将元素(97) 插入合适位置: [38 49 65 97] 76 13 27 49
将元素(76) 插入合适位置: [38 49 65 76 97] 13 27 49
将元素(13) 插入合适位置: [13 38 49 65 76 97] 27 49
将元素(27) 插入合适位置: [13 27 38 49 65 76 97] 49
将元素(49) 插入合适位置: [13 27 38 49 49 65 76 97]

#include<stdio.h>

void InsertSort(int*, int);
void printArray(int*, int);

int main()
{
    int n;
    scanf("%d", &n);
    int a[n];
    int i;
    for (i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    InsertSort(a, n);
    return 0;
}

void InsertSort(int a[],int n)
{
    int i, j, tmp;
    for (i = 1; i < n; i++)
    {
        tmp = a[i];
        j = i - 1;
        while (tmp < a[j])
        {
            a[j + 1] = a[j];
            j--;
        }
        a[j + 1] = tmp;
        printArray(a, n);
    }
}

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

4、快速排序

例题:来自洛谷

https://www.luogu.com.cn/problem/P1177
#include <stdio.h>

void myqsort(int l, int r);

int a[1000001];

int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    myqsort(0, n - 1);
    for (int i = 0; i < n; i++)
    {
        printf("%d ", a[i]);
    }
    return 0;
}

void myqsort(int l, int r)
{
    int key = a[(l + r) / 2];
    int i = l, j = r;
    while (i <= j)
    {
        while (a[i] < key)
        {
            i++;
        }
        while (a[j] > key)
        {
            j--;
        }
        if (i <= j)
        {
            int tmp = a[i];
            a[i] = a[j];
            a[j] = tmp;
            i++;
            j--;
        }
    }
    if (l < j)
    {
        myqsort(l, j);
    }
    if (i < r)
    {
        myqsort(i, r);
    }
}

5、桶排序

例题:来自洛谷

https://www.luogu.com.cn/problem/P1059
#include <stdio.h>

int main()
{
    int x[10001] = {0};
    int n, num;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &num);
        x[num]++;
    }
    for (int i = 0; i < 10001; i++)
    {
        for (int j = 0; j < x[i]; j++)
        {
            printf("%d ", i);
        }
    }
    return 0;
}

6、堆排序

7、归并排序

8、希尔排序

9、基数排序

10、对超大数据(几百位)的排序

例题:来自洛谷

https://www.luogu.com.cn/problem/P1781

使用字符串储存,通过比较长度(strlen)和比较字典顺序(strcmp)来进行比较排序

分类: 算法