常用排序方法总结

本文详细解析了八大经典排序算法,包括冒泡排序、简单选择排序、直接插入排序、希尔排序、快速排序、堆排序、归并排序和桶排序。通过C/C++代码实现,深入浅出地讲解了算法原理和应用场景。

面试常见问题,手撕快排、归并排序,或者手写一些查找算法,比如二分查找等。

本片及下篇博客将分别总结常见的排序算法和查找算法,主要是基于C或者C++。

这些问题本质都不难,只要勤加练习,充分理解,方能记于心中。


1、冒泡排序

#include "stdio.h"
#include "stdlib.h"
#include "stdbool.h"

void bubbleSort(int *array, int len)
{
    int tmp = 0;
    bool flag = false;
    for (int i = 0; i < len - 1; i++) {
        flag = false;
        for (int j = len - 1; j > i; j--) {
            if (array[j-1] > array[j]) {
                tmp = array[j];
                array[j] = array[j-1];
                array[j-1] = tmp;
                flag = true;
            }
        }
        if (!flag) {
            break;
        }
    }
	
    return;
}

#define len 10
int main()
{
    int array[len] = {10, 8, 9, 5, 6, 7, 2, 1, 4, 3};
    bubbleSort(array, len);
    for (int i = 0; i < len; i++) {
        printf("array[%d] = %d\n", i, array[i]);
    }
}

 

2、简单选择排序

 

 

3、直接插入排序

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

#define tostr(x) #x

void shellSort(int *array, int len, char *order)
{
    if (array == NULL || len == 1) {
        return;
    }
    int tmp,j;
    for (int i = 1; i < len; i++) {
        j = i;
        tmp = array[i];
        if (strcmp(order, tostr(up)) == 0) {
            while ((j > 0) && (tmp < array[j-1])) {
                array[j] = array[j-1];
                j--;
            }
        } else if (strcmp(order, tostr(up)) == 0) {
            while ((j > 0) && (tmp > array[j-1])) {
                array[j] = array[j-1];
                j--;
            }
        }
        array[j] = tmp;
    }

    return;
}

/* 浣跨敤璇存槑锛?
 * 1. gcc straightInsertSort.c -o straightInsertSort
 * 2. 鍗囧簭鎺掑垪锛?./straightInsertSort up
 * 3. 鍗囧簭鎺掑垪锛?./straightInsertSort down
 */
#define len 10
int main(int argc, char **argv)
{
    int array[len] = {10, 8, 9, 5, 6, 7, 2, 1, 4, 3};
    shellSort(array, len, argv[1]);
    for (int i = 0; i < len; i++) {
        printf("array[%d] = %d\n", i, array[i]);
    }
}



 

4、希尔排序

/* 
 * shell排序
 * 1. 分组 len/2
 * 2. 插排 对分组后的每组进行插入排序,注意插入起点和步距
 * 3. 组数和步距相同
 */
#include <stdio.h>

void printArr(int *array, int len)
{
    int i;
    for (i = 0; i < len; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");
    return;
}


void shellSort(int *array, int len)
{
    int j;
    for (int step = len/2; step >= 1; step /= 2) {
        for (int group = 0; group < step; group++) { /* 对每组进行插排处理 */
            for (int i = group; i < len - step; i += step) {
                int InsertEle = array[i + step];
                j = i + step;
                while ((j - step >= 0) && (InsertEle < array[j-step])) {
                    array[j] = array[j-step];
                    j -= step;
                }
                array[j] = InsertEle;
            }
            printArr(array, len);
        }
    }
    return;
}

#define len 2
int main(int argv, char **argc)
{
    int array[len] = {5, 2};
    printArr(array, len);
    shellSort(array, len);
    printArr(array, len);
}

 

5、快速排序

#include <stdio.h>

void printArr(int *array, int len)
{
    int i;
    for (i = 0; i < len; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");
    return;
}


int getMid(int *array, int head, int tail)
{
    int referenceData = array[head];
    while (head != tail) {
        while (array[tail] > referenceData && head < tail) {
            tail--;
        }
        array[head] = array[tail];
        while (array[head] <= referenceData && head < tail) {
            head++;
        }
        array[tail] = array[head];
    }
    array[head] = referenceData;
    printf("mid = %d\n", head);
    return head;
}

void quickSort(int *array, int head, int tail)
{
    if (head < tail) {
        int mid = getMid(array, head, tail);
        quickSort(array, head, mid-1);
        quickSort(array, mid+1, tail);
    }

    return;
}

#define len 7
int main(int argv, char **argc)
{
    int array[len] = { 6, 5, 6, 8, 9, 2, 15 };
    printArr(array, len);
    quickSort(array, 0, len-1);
    printArr(array, len);
}

 

6、堆排序

 

 

7、归并排序

参考文章:https://www.cnblogs.com/chengxiao/p/6194356.html

感觉这两张图片写到很长好,分治法。

void mergeSortArray(int *array, int head, int mid, int tail, int *buffer)
{
    int head_s = head;
    int tail_s = tail;
    int mid_s = mid + 1;
    int bufferIndex = 0;
    while (head_s <= mid && mid_s <= tail)
    {
        if (array[head_s] < array[mid_s]) {
            buffer[bufferIndex++] = array[head_s++];
        } else {
            buffer[bufferIndex++] = array[mid_s++];
        }
    }
    while (head_s <= mid)
    {
        buffer[bufferIndex++] = array[head_s++];
    }
    while (mid_s <= tail) 
    {
        buffer[bufferIndex++] = array[mid_s++];
    }
    for (int i = 0; i < bufferIndex; i++) {
        array[head + i] = buffer[i];
    }
}
/* 调用入口 */
void mergeSort(int *array, int head, int tail, int *buffer)
{
    if (head < tail) {
        int mid = (head + tail) / 2;
        mergeSort(array, head, mid, buffer);
        mergeSort(array, mid+1, tail, buffer);
        mergeSortArray(array, head, mid, tail, buffer);
    }
}

 

8、桶排序

 

 


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值