希尔排序、快速排序等js方法实现

一、插入排序

1、直接插入排序

无序序列逐个插入到有序序列。

function straisort(r,n){// length 为n的数组r
    var i,j,x;
    for(i = 1;i<n;i++){
        x = r[i];
        j = i-1;
        while(x < r[j]){
            r[j+1]=r[j]
            j--
        }
        r[j+1]= x;
    }
}

2、希尔排序

分组的基础上进行简单插入排序,降低时间复杂度。

    function shellsort(r,n,d,T){// r为待排序数组,n为r的长度,d 为增量序列数组[5,3,1],T为d 的长度。
        var i,j,k,x;
        k = 0;
        while(k<T){
            for(i = d[k]-1;i<n;i++){
                // i 为未排序记录的位置
                x = r[i];
                j = i - d[k]// j 为本组i前面记录的位置
                while((j>=0)&&x<r[j]){
                    // 组内简单插入排序
                    r[j+d[k]] = r[j];
                    j = j-d[k];
                }
                r[j + d[k]] = x;
            }
            k++;
        }
    }

希尔伯特(hibbard’s)增量序列
h k = 2 k − 1. h_k = 2^k-1. hk=2k1.
平均时间复杂度
T ( N ) = O ( N 5 / 4 ) . T(N)=O(N^{5/4}). T(N)=O(N5/4).
Sedgewick’s 最佳增量序列,目前已知最佳。

h i = 9 ∗ 4 i − 9 ∗ 2 i + 1. h_i = 9*4^i - 9*2^i +1. hi=94i92i+1.
平均时间复杂度
T ( N ) = O ( N 7 / 6 ) . T(N)=O(N^{7/6}). T(N)=O(N7/6).

二、选择排序

1、简单选择排序

无序序列中选择最小(大)的值加入到有序序列。

function smp_seleSort(r,n){
    var i,j,k,x;
    for(i=0;i<n-1;i++){
        k = i;
        for(j=i+1;j<=n-1;j++){
            if(r[j] < r[k]) k=j;
            if(i !== k){
                x = r[i];
                r[i] = r[k];
                r[k] = x;
            }
        }
    }
}

三、交换排序

1、冒泡排序

    function bubble_sort(r,n){
        var m,j,x;
        var flag=1
        m = n;
        while((m>1)&& flag === 1){
            flag = 0;// 本趟是否有交换操作标识初始化
            for(j = 1;j < m;j ++){
                if(r[j] > r[j+1]){
                    flag = 1;
                    x = r[j];
                    r[j] = r[j+1];
                    r[j+1] = x;
                }
            }
            m--;
        }
    }

2、快速排序

分治法思想,选一个枢纽,小的放左边,大的放右边。

function qksort(r = [], t, w){ // t = low, w = high
    var i,j,x;
    if(t>w){ return;}
    i = t;j = w; // i 指针向后移动,j指针向前移动
    x = r[i];// 枢纽取第一个
    // x = median(r,i,j);//枢纽取三者其中
    while(i<j){
        while((i<j)&&(r[j]>=x)){//  先移动j,枢纽后面的值,大于枢纽
            j --;}
        if(i<j){// 不满足时,把j 赋值给 i 
            r[i] = r[j];i ++; }
        while((i<j)&&(r[i]<=x)){// //枢纽前面的值,小于枢纽
            i++; }
        if(i<j){// 不满足时,把 i 赋值给 j ,j拿到一个较为合适的值
            r[j]= r[i]; j--;}
    }
    r[i] = x;// 把枢纽插回合适位置
    qksort(r,t,j-1);
    qksort(r,j+1,w);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值