美文网首页
算法--排序

算法--排序

作者: jsqwj | 来源:发表于2017-11-06 22:30 被阅读0次

关于排序的一点代码

#include <stdio.h>
void  exch(int *a, int i, int j){
    int tmp;
    tmp = a[i];
    a[i] = a[j];
    a[j] = tmp;

}
void select(int *array, int len){
    int j = 0;
    int tmp, i;
    for(; j < len; j++){
        for(i = j+1, tmp = j; i < len; i++){
            if(array[i] < array[tmp])
                tmp = i;
        }

        i = array[j];
        array[j] = array[tmp];
        array[tmp] = i;
    }
}

void insert(int *a, int len){
    int i, pos,tmp, dd;
    i = 1;
    for(; i < len; i++){ //因为要把每一个位置的数据放在它前面中最小的地方,所以要遍历每一个数据

        tmp = i;
        while(tmp-1 >= 0 && a[tmp-1] > a[tmp]){     //这里就是把一个数据不断跟前面的一位比较,如果小于前面的一位就一直交换
            exch(a, tmp, tmp-1);
            tmp--;
            dd++;
        }
    }
    printf("%d\n", dd);
    for(dd = 0; dd < len; dd++)
    printf("%d ", a[dd]);
printf("\n");
}

void shellsort(int * a, int len){
    int h = 1, i, j, dd = 0;
    while(h < len / 3) h = 3*h + 1;  //这里是选key的一种方式,也可以直接len/2

    for (; h >= 1; h /= 3){
        if(h == 1) printf("dds");
        for(i = h; i < len; i++ ) {    //如果使用i = 0; i < h;i++;这种方式是对每一个组排序,而这种是对每一个数据直接位移,也就是对相应的每一个组
            for(j = i; j-h >= 0 && a[j] < a[j - h]; j -= h){
                exch(a, j, j - h);
                dd++;
            }   
        }
    }
    printf("%d\n", dd);
    for(dd = 0; dd < len; dd++)
        printf("%d ", a[dd]);
    printf("\n");
}
void _merge(int *a, int *tmp, int lo, int hi){
    if(lo >= hi) return;
    if(hi - lo == 1) {
        if(a[lo] > a[hi])
            exch(a, lo, hi);
        return;
    }
    int mid = (lo + hi) / 2;
    _merge(a, tmp, lo,  mid);       //把范围一直缩小到左半部最小范围,先排序小的再进行合并
    _merge(a, tmp, mid, hi);        //同理
    int i = lo, j = mid;
    int k = lo;
    for(; k <= hi; k++ ) {          //把3个及以上的数组进行合并排序,这里是先把它们拷贝到tmp数组
        tmp[k] = a[k];
    }

    for(k = lo; k <= hi; k++) {     //把tmp数组分为两部分,从0-mid, mod-len, 不断把最小的数拷贝进原数组,左半部拷贝完就一直拷贝右半部,左面的数小于右面就拷贝右面
        if(i >= mid) a[k] = tmp[j++];
        else if(j > hi) a[k] = tmp[i++];
        else if(tmp[i] > tmp[j]) a[k] = tmp[j++];
        else a[k] = tmp[i++];
    }
}
void merge(int *a, int len){
    int tmp[len];
    _merge(a, tmp, 0, len-1);
}

void _quicksort(int *a, int lo, int hi){
    if (lo >= hi)
        return;
    
    int i = lo, j = hi, k = i, dd = 0;
    int key = a[i];
    i++;
    while(i < j){
        while(i < j && a[i] < key)
            i++;
        while(i < j && a[j] > key)
            j--;
        exch(a, i, j);
    }
    exch(a, lo, i);

    _quicksort(a, lo, i-1);
    _quicksort(a, i+1, hi);
}

void quicksort(int *a, int len){
    _quicksort(a, 0, len-1);
}


int main(){
    int a[] = {234,22,23443,53,434,32,3,0,2341,33,3};
    int i = 0;
    int len = sizeof(a)/sizeof(int);
    quicksort(a, len);

    for(; i< len; i++){
        printf("%d ", a[i]);
    }
    printf("\n");
}

相关文章

  • java实现快速排序、归并排序、希尔排序、基数排序算法...

    快速排序算法 归并排序算法 希尔排序算法 基数排序算法

  • web开发需要知道的几个算法

    算法分类 快速排序算法 深度优先算法 广度优先算法 堆排序算法 归并排序算法

  • 算法学习(1)-排序算法

    八大排序算法九大排序算法再总结[经典排序算法][集锦][直观学习排序算法] 视觉直观感受若干常用排序算法 快速排序...

  • 经典排序算法总结

    经典排序算法集锦 冒泡法 排序算法入门之冒泡排序 排序算法入门之冒泡排序优化

  • 前端算法学习-第一篇

    冒泡排序算法 冒泡排序算法是最慢的排序算法之一,也是最容易实现的排序算法。之所以叫冒泡排序是因为使用这种算法排序时...

  • 七大排序算法之冒泡排序

    七大排序算法之冒泡排序 @(算法笔记)[排序算法, 冒泡排序, C++实现] 冒泡排序介绍 冒泡排序是七大排序算法...

  • 算法-选择排序

    算 法:选择排序算法时间复杂度: 选择排序算法概述 选择排序伪代码 选择排序实现 选择排序算法概述 排序算法有许...

  • 浅谈排序算法

    排序算法有很多种,今天先谈谈一些简单的排序算法。包括桶排序、冒泡排序和快速排序算法。后期总结各种排序算法。 桶排序...

  • 线性排序

    桶排序、计数排序、基数排序 一、线性排序算法介绍 1.线性排序算法包括桶排序、计数排序、基数排序。2.线性排序算法...

  • 算法4:插入排序和选择排序算法的比较

    排序算法列表电梯: 选择排序算法:详见 《算法4》2.1 - 选择排序算法(Selection Sort), Py...

网友评论

      本文标题:算法--排序

      本文链接:https://www.haomeiwen.com/subject/tfmrmxtx.html