C语言排序学习

1.选择排序和冒泡排序

 

时间复杂度:O(n^{2})

我想讲一下,程序员写这种排序的时候名字都是尽量取的让人能通俗易懂一些的,比如选择,就是每次都拿首个数去和其他的数比嘛。但是,往往这种排序在时间复杂度上都是非常冗余的。还有就是冒泡排序了,顾名思义嘛,让数列像泡泡一样冒出来啦啦啦,两两对比。

//选择排序
for(int i=0;i<n;i++){
    for(int j=i;j<n;j++){
        if(a[j]<a[i]){
            s =a[j];
            a[j]=a[i];
            a[i] =s;
        }
    }

}
for(int i = n;i>0;i--){
    for(int j =i;j>=0;j--){
        if(a[j]<a[j-1]){
            s = a[j];
            a[j] = a[j-1];
            a[j-1]=s;
        }
    }
}
//以上是冒泡排序的基本逻辑

2.插入排序

时间复杂度O(n)

首先这里实现插入排序的时候是用一个链表来实现的,然后也巧妙的使用了一个叫哨兵的鬼玩意儿,当然我觉得可以用别的东西来代替的,比如定义一个int s啊之类的,插入也就是表面意思,在原有已经排好的基础上再插入就行,接下来就直接上代码喽

for(int i=1;i<l.length;i++){
    if(l.data[i]<l.data[i-1]){
        int s =l.data[i];
        //只有在后面一个比前面小的情况下才需要插入排序
        for(int j=i;s<l.data[j-1];j--){
              l.data[j+1] =l.data[j];
        }
        l.data[j]=s;
    }

}

3.堆排

堆排其实就是类似于二叉树的排序,首先在脑中建立起一个二叉树,对要传入的数据进行筛查,把最大的往前送,并且使得每一个根节点下的子树又是一个“大头树”。当使得二叉树的根节点a[0]是最大数时,然后和最后一个结点交换,依次类推。

void stack_sort(int str[],int n){
    int father = n/2;
    int son = father * 2+1;
    while(son<n){
    if(str[son]<str[son+1]){
        son++;
    }

    if(str[son]>str[father]){
        swap(str[son],str[father])
        //这个函数就是交换他俩数据用的哦
        father = son;
        son = father *2+1;
    }
    }

}



void main_sort(int str[],int n){
    for(int i=0;i<n;i++){
        stack_sort(str,n);
    }
    swap(str[0],str[n-1])
}

4.快排

  快速排序奥,是工作中经常用到的,基本的用法就是三数排序

        (1)先找数组的头个然后往后判断,看他是不是最小的,如果是最小的话,那就直接跳过他,往后继续快排

        (2)每次都得记录一下

void quick_sort(int str[],int low,int high){
    swap = str[low];
    while(low<high && str[low]<=str[high]){
        high--;
    }
    if(low < high){
        str[low]=str[high];
    }

    while(low<high && str[high]<=){
        low++;
    }
    if(low < high){
         str[high] = str[low];
    }
    str[low]=str[high];
    return low;
}


void quick_sort(int str[],int a,int b){
     while(a<b){
        int location=get_location(str,a,b);
        quick_sort(str,location+1,b);
        quick_sort(str,a,location-1);
    }   
}

5.归并排序

归并排序,我觉得真的很智障,我???当时看了一个博主写的归并,我直接在云雾弥漫的天际遨游了好几天,我真的很沉醉,明明只用一个数组+一个临时数字解决的问题,他非得3个数组之间来回递归,我真的会shit。

void merge(int str[],int a,int b,int mid){
    int left_start=a;
    int right_start=mid+1;
    int tem[20];
    int k=0
    while(left_start<mid && right_start<b){
        if(str[left_start]<str[right_start]){
            tem[k++]=str[left_start];
        }else{
            tem[k++]=str[right_start];
        }
    }
    while(left_start<mid){
        tem[k++]=str[left_start];
    }
    while(right_start<b){
        tem[k++]=str[right_start];
    }
    
}


void conbination_sort(int str[],int a,int b){
    if(a ==b ){
        return;
    }
    else{
    int mid = (a+b-1)/2
    conbination_sort(str,a,mid-1);
    conbination_sort(str,mid+1,b);
    merge(str,a,b,mid);
    }
}

6.希尔排序

啦啦啦,希尔排序,也不知道又是谁想出来这种方法的,总之用到现在,终于知道为啥快排那么好用了呢。闲话不多说直接上代码咯

void xier_sort(int a[],int len){
    int j,i,k,swap
    for(j = len/2;j>=1;j=j/2){
        for(i=len+1;i<=len;i++){
            if(a[i]<a[i-len]){
            swap = a[i];
            for(k=i-len;a[k]>a[k+len] && k>=0;k-=j)
                a[k+len] =a[k];
            }
            a[k+len]=swap;
        }
         
    }
    
}

 

 结束了自己罪孽的一生

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值