排序算法之快排,希尔和冒泡

简介: 排序算法之快排,希尔和冒泡

       排序算法有很多种,平常工作其实用到的不多,但是这几种的思想和实现需要了解。而且记起来也不容易混淆。

       快速排序的特点是,有两个索引去递增和递减,去跟基准比较。通过将基准小的排在前面,基准大的排在后面,递归完成。

int sort(int *data, int left, int right){
    if(left >= right) return 0;
    int i = left;
    int j = right;
    int key = data[i];
    while(i < j){
        //每次大循环内可能同时有i++和j--,如果二层循环不加i < j,可能会导致i > j?(猜想),经测试,不加i < j,结果一样 
        //while(i < j && key < data[j]){
        while(key < data[j]){//后面的值比基准值大就正常移动,一旦碰到比基准值小的就停下
            j--;//从后往前移动
        }
        data[i] = data[j];//将小于基准的值放到前面
        //while(i < j && key >= data[i]){
        while(key >= data[i]){//基准值比前面的值小就正常移动,一旦碰到比基准值大的就停下
            i++;//从前往后移动 
        }
        data[j] = data[i];//将大于基准的值放在后面,j的位置是刚才从后往前移动时小于基准值的位置,已经被挪到前面
    }
    data[j] = key;//当i==j时,循环结束,此时的位置i==j即为基准值应该放置的位置。 
    sort(data, left, i-1);//排列基准位置左边的序列
    sort(data, i+1, right);//排列基准位置右边的序列
}

       希尔排序的核心思想是分组,然后组内排序。分组的方法类似于,搞团建的时候一个长队伍报数(长度为N),先是1到10(其实是N/2)报数,然后报同一个数字的一组(报1的一组,2的一组……),组内比较。再1到5报数,同样的方式再排序一遍。直到最后1到2报数,这是最后一次组内排序。从这个叙述来看,希尔排序又叫缩小增量排序就很好理解了。

int shell_sort(int *data, int len){
    int gap = 0;//分组跨度
    int i = 0, j = 0;
    for(gap = len / 2; gap >= 1; gap /= 2){ //分组次数的循环
        for(i = gap; i < len; i++){
            int temp = data[i];
            for(j = i - gap; j >=0 && temp < data[j]; j = j - gap){
                data[j+gap] = data[j];
            }
            data[j+gap] = temp;
        }
    }
    return 0;
}

       最后冒泡排序是最基础的一种,每次比较两个相邻的元素,如果前面的比后面的大,就交换。这里不贴实现,主要是用来做时间复杂度的对比。

排序方法 时间复杂度(平均) 时间复杂度(最坏) 时间复杂度(最好)
冒泡排序 O(n2) O(n2) O(n)
希尔排序 O(n1.3) O(n2) O(n)
快速排序 O(nlog2n) O(n2) O(nlog2n)
相关文章
|
1月前
|
算法 搜索推荐 JavaScript
NodeJ实现冒泡算法
NodeJ实现冒泡算法
25 0
|
1月前
|
算法 搜索推荐 Java
Java实现冒泡算法
Java实现冒泡算法
22 0
|
7天前
|
搜索推荐 算法
【排序】数据结构——排序算法概念及代码详解(插入、冒泡、快速、希尔)
【排序】数据结构——排序算法概念及代码详解(插入、冒泡、快速、希尔)
|
3天前
|
人工智能 算法 搜索推荐
蓝桥杯宝藏排序题目算法(冒泡、选择、插入)
以下是内容的摘要: 本文介绍了三种排序算法:冒泡排序、选择排序和插入排序。冒泡排序通过不断交换相邻的逆序元素逐步排序,最坏情况下需要 O(n^2) 次比较。选择排序在每轮中找到剩余部分的最小元素并放到已排序序列的末尾,同样具有 O(n^2) 时间复杂度。插入排序则是将每个元素插入到已排序序列的正确位置,时间复杂度也是 O(n^2),但空间复杂度为 O(1)。
|
1月前
|
存储 算法 搜索推荐
【算法】七大经典排序(插入,选择,冒泡,希尔,堆,快速,归并)(含可视化算法动图,清晰易懂,零基础入门)
【算法】七大经典排序(插入,选择,冒泡,希尔,堆,快速,归并)(含可视化算法动图,清晰易懂,零基础入门)
101 1
|
1月前
|
搜索推荐
图解基础排序算法(冒泡、插入、选择)(山东大学实验二)
图解基础排序算法(冒泡、插入、选择)(山东大学实验二)
|
7月前
|
搜索推荐 Java
排序算法-冒泡、选择、堆、插入、归并、快速、希尔
排序算法-冒泡、选择、堆、插入、归并、快速、希尔
17 0
|
1月前
|
算法 C语言
C语言数组实例(冒泡算法、猜数字)
C语言数组实例(冒泡算法、猜数字)
21 0
|
10月前
|
算法 JavaScript 搜索推荐
[JavaScript] 常用算法介绍「冒泡算法」
JS中的冒泡排序算法(Bubble Sort)是一种简单而常用的排序算法。它通过多次迭代比较相邻的元素,并根据需要交换它们的位置,使得每一轮迭代都能找到当前数据集中的最大(或最小)值,并将其移至合适的位置。
|
7月前
|
搜索推荐
深入探究常用排序算法:冒泡、插入、选择与快速排序
深入探究常用排序算法:冒泡、插入、选择与快速排序