常用排序算法

  • 目录
  • 冒泡排序
  • 选择排序
  • 插入排序
  • 希尔排序
  • 快速排序
  • 归并排序
  • 堆排序
  • 致谢

1. 冒泡排序

C实现,从小到大

void bubble_sort(int arr[], int length) {
    for (int i = 0; i < length; i++) {
        for (int j = 0; j < length-i-1; j++) {
            if (arr[j] > arr[j+1]) {
                int temp = arr[j+1];
                arr[j+1] = arr[j];
                arr[j] = temp;
            }
        }
    }
}
2. 选择排序

C实现,从小到大

void selection_sort(int arr[], int length) {
    for (int i = 0; i < length; i++) {
        int min = i;
        for (int j = i+1; j < length; j++) {
            if (arr[min] > arr[j]) {
                min = j;
            }
        }
        if (min != i) {
            arr[i] = arr[min] + arr[i];
            arr[min] = arr[i] - arr[min];
            arr[i] = arr[i] - arr[min];
        }
    }
}
3. 插入排序

C实现,从小到大

void insertion_sort(int arr[], int length) {
    int j;
    for (int i = 1; i < length; i++) {
        if (arr[i] < arr[i-1]) {
            int temp = arr[i];
            for (j = i-1; j >= 0 && temp < arr[j]; j--) {
                arr[j+1] = arr[j];
            }
            arr[j+1] = temp;
        }
    }
}
4. 希尔排序

C实现,从小到大

void shell_sort(int arr[], int length) {
    int increment = length;
    int k;
    do {
        increment = increment/3+1;
        for (int i = 0; i < increment; i++) {
            for (int j = i+increment; j < length; j+=increment) {
                if (arr[j] < arr[j-increment]) {
                    int temp = arr[j];
                    for (k = j-increment; k >= 0 && temp < arr[k]; k-=increment) {
                        arr[k+increment] = arr[k];
                    }
                    arr[k+increment] = temp;
                }
            }
        }
    } while (increment > 1);
}
5. 快速排序

C实现,从小到大

void quick_sort(int arr[], int start, int end) {
    int i = start;
    int j = end;
    int temp = arr[start]; 
    if (i < j) {
        while (i < j) {
            while (i < j && arr[j] > temp) {
                j--;
            }
            if (i < j) {
                arr[i] = arr[j];
                i++;
            }
            while (i< j && arr[i] < temp) {
                i++;
            }
            if (i < j) {
                arr[j] = arr[i];
                j--;
            }
        }
        arr[i] = temp;
        quick_sort(arr, start, i-1);
        quick_sort(arr, i+1, end);
    }
}
6. 归并排序

C实现,从小到大

void __my_merge(int arr[], int start, int mid, int end, int *temp) {
    int i_start = start;
    int i_end = mid;
    int j_start = mid+1;
    int j_end = end;
    int length = 0;
    while (i_start <= i_end && j_start <= j_end) {
        if (arr[i_start] < arr[j_start]) {
            temp[length] = arr[i_start];
            length++;
            i_start++;
        } else {
            temp[length] = arr[j_start];
            length++;
            j_start++;
        }
    }
    while (i_start <= i_end) {
        temp[length] = arr[i_start];
        length++;
        i_start++;
    }
    while (j_start <= j_end) {
        temp[length] = arr[j_start];
        length++;
        j_start++;
    }
    for (int i = 0; i < length; i++) {
        arr[start+i] = temp[i];
    }
}

void merge_sort(int arr[], int start, int end, int *temp) {
    if (start >= end) {
        return;
    }
    int mid = (start+end)/2;
    merge_sort(arr, start, mid, temp);
    merge_sort(arr, mid+1, end, temp);
    __my_merge(arr, start, mid, end, temp);
}
7. 堆排序

C实现,从小到大

void heap_adjust(int arr[], int index, int length) {
    int max = index;
    int left_child = max*2+1;
    int right_child = max*2+2;
    if (left_child < length && arr[left_child] > arr[max]) {
        max = left_child;
    }
    if (right_child < length && arr[right_child] > arr[max]) {
        max = right_child;
    }
    if (max != index) {
        int temp = arr[max];
        arr[max] = arr[index];
        arr[index] = temp;
        heap_adjust(arr, max, length);
    }
}
void heap_sort(int arr[], int length) {
    for (int i = length/2-1; i >= 0; i--) {
        heap_adjust(arr, i, length);
    }
    for (int i = length-1; i > 0; i--) {
        int temp = arr[0];
        arr[0] = arr[i];
        arr[i] = temp;
        heap_adjust(arr, 0, i);
    }
}

不定期更新 不合适的地方 还请指点~ 感激不尽

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 排序算法基础 排序算法,是一种能将一串数据按照特定的排序方式进行排列的一种算法,一个排序算法的好坏,主要从时间复杂...
    jackyshan阅读 4,292评论 3 11
  • 大写的转 目录 [冒泡排序][鸡尾酒排序] [选择排序] [插入排序][二分插入排序][希尔排序] [归并排序] ...
    Solang阅读 1,858评论 0 16
  • 最近在看数据结构,研究了一下常用的几种排序方法:1.冒泡排序,2.选择排序,3.插入排序,4.希尔排序,5.快速排...
    wo883721阅读 1,551评论 0 4
  • 引言 排序是算法恒久不变的话题,也是面试的常客,常见的排序方法有冒泡、选择、插入、堆、希尔、归并、计数、基数和快速...
    kakaxicm阅读 350评论 0 0
  • 当我们进行数据处理的时候,往往需要对数据进行查找操作,一个有序的数据集往往能够在高效的查找算法下快速得到结果。所以...
    Single_YAM阅读 1,156评论 0 3

友情链接更多精彩内容