美文网首页
有趣的冒泡排序

有趣的冒泡排序

作者: 始于尘埃 | 来源:发表于2019-06-18 20:15 被阅读0次

    跟着米Sir学编程

    #include <stdio.h>
    #include <stdlib.h>
    //初级冒泡排序
    void func1(int a[],int n){
        int temp=0;
        for(int i=0;i<n-1;i++){    //当循环比较n-1次的时候,最后的那个元素已经确定了
            for(int j=i+1;j<n;j++){    //按道理来说,第二次循环会少一次,但是第二次循环是要所有元素都要遍历,所以是n-2+1=n-1
                if(a[i]>a[j]){
                    temp = a[i];
                    a[i] = a[j];
                    a[j] = temp;
                }
            }
        }
    }
    //冒泡排序升级版(关键:元素两两比较;效率有所提升)
    void func2(int a[],int n){
        int temp = 0;
        int flag=1;
        for(int i=0;i<n-1&&flag;i++){    //循环n-1次:最后一个元素不用比价;用来存放元素
            for(int j=n-1;j>i;j--){ //重最底层开始做循环
                flag=0;
                if(a[j-1]>a[j]){
                    temp = a[j-1];
                    a[j-1] = a[j];
                    a[j] = temp;
                    flag=1;      //只要看到flag没有发生变化,就证明已经排好了
                }
            }
    }
    }
    void main(){
        int a[10]={2,5,3,1,7,6,9,0,8,10};
        func2(a,10);
        for(int i=0;i<10;i++){
            printf("%d->",*(a+i));
        }
        printf("\n");
        system("pause");
    }
    
    //直接插入排序
    #include <stdio.h>
    
    int main(){
        int i;
        void func2(int arr[],int n);
        int a[9]={0,1,5,2,3,7,9,6,4}; //func2中a[0]作为哨兵
        func2(a,9);
        for(i=1;i<9;i++){
            printf("->%d",a[i]);
        }
        return 0;
    }
    void func1(int arr[],int n){
        int i,j,temp;
        for(i=1;i<n;i++){
            if(arr[i]<arr[i-1]){  //证明需要移动位置
                temp=arr[i];
    
                for(j=i-1;arr[j]>temp;j--){   //依次比较i-1后面的每一个元素,如果>temp,需要向后移动(覆盖);退出该for循环时,前两个数字相等,需要把后一个数字替换成较大的
                    arr[j+1]=arr[j];     //依次替换
                }
                arr[j+1]=temp;
            }
        }
    }
    void func2(int k[],int n){//如果第一个元素k[0]设为哨兵
        //1-n进行比较
        for(int i=2;i<n;i++){ //重第二个元素开始插入
            //每选取一个元素,都要进行下列插入
            if(k[i-1]>k[i]){
                k[0]=k[i];  //哨兵保存
                k[i] = k[i-1]; //把最大的数弹出去(由于已近是排好序的,所以k[i-1]就是最大的数)
                for(int j=i-2;k[j]>k[0];j--)//由于前面已经进行了交换,所以i-2开始
                {
                    //交换覆盖
                    k[j+1]=k[j];
                }
                //交换完后
                k[j+1]=k[0];
            }
        }
        
    }
    
        
    
    

    相关文章

      网友评论

          本文标题:有趣的冒泡排序

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