zoukankan      html  css  js  c++  java
  • 【Sorting Collection】

    排序集锦

    各种排序算法,总结一下,一直在遗忘......

    【冒泡排序】

    就是下面这个鬼啦:

    c实现代码(升序):

    #include<stdio.h>
    
    void BubbleSort(int *array,int num)
    {
            int i,j,temp;
            for(j=0;j<num;j++)
        {
            for(i=1;i<num-j;i++)
                    {
                            if(array[i-1]>array[i]) //倒序就把这里改成<咯
                            {
                                    temp=array[i-1];
                                    array[i-1]=array[i];
                                    array[i]=temp;
                            }
                    }
        }
    }
    int main()
    {
            int num;
            scanf("%d",&num);
            int array[num]; 
            int i;
            for(i=0;i<num;i++)
            {
                    scanf("%d",&array[i]);
            }
            BubbleSort(array,num); 
            for(i=0;i<num;i++)
            {
                    printf("%d ",array[i]);
            }
            printf("
    ");
            return 0;
    
    }

    【插入排序】

    按顺序插入

    C语言实现:

    #include<stdio.h>
    
    void insertionsort(int *array,int num)
    {
        int i,j;
        for(i=1;i<num;i++)
        {
            int current=array[i];
            j=i-1;
            while(j>=0 && array[j]>current)
            {
                array[j+1]=array[j];//后移为current空出位置
                j--;
            }
            array[j+1]=current;//将current插入空位
        }
    }
    
    
    int main()
    {
        int num;
        scanf("%d",&num);
        int array[num];
        int i;
        for(i=0;i<num;i++)
        {
            scanf("%d",&array[i]);
        }
        insertionsort(array,num);
        for(i=0;i<num;i++)
        {
            printf("%d ",array[i]);
        }
        printf("
    ");
        return 0;
    } 

    【希尔排序】

     C语言实现代

    #include<stdio.h>
    void shellsort(int *array,int num)
    {
        int i,j,increment,temp;
        for(increment=num/2;increment>0;increment/=2)
        {
            for(i=increment;i<num;i++)
            {
                temp=array[i];
                for(j=i;i>=increment;j-=increment)
                {
                    if(temp<array[j-increment])
                    {
                        array[j]=array[j-increment];
                    }    
                    else
                    {
                        break;
                    }
                }  
                array[j]=temp;
            }  //这里其实跟普通插入一样咯,除了间隔大点
        }  //更改步长,直至最后increment=1,即为普通插入排序
    }
    
    int main()
    {
            int num;
            scanf("%d",&num);
            int array[num]; 
            int i;
            for(i=0;i<num;i++)
            {
                    scanf("%d",&array[i]);
            }
            shellsort(array,num); 
            for(i=0;i<num;i++)
            {
                    printf("%d ",array[i]);
            }
            printf("
    ");
            return 0;
    }

    【选择排序】

    C语言实现代码:

    #include<stdio.h>
    void selectionsort(int *array,int num)
    {
        int i,j,minindex,temp;
        for(i=0;i<num;i++)  //从0开始挑选出i之后最小的数放到i的位置
        {
            minindex=i;
            for(j=i+1;j<num;j++)
            {
                if(array[j]<array[minindex])
                {
                    minindex=j;
                }
            }
            temp=array[i];
            array[i]=array[minindex];
            array[minindex]=temp;
        }
    }
    
    int main()
    {
        int num;
        scanf("%d",&num);
        int array[num];
        int i;
        for(i=0;i<num;i++)
        {
            scanf("%d",&array[i]);
        }
        selectionsort(array,num);
        for(i=0;i<num;i++)
        {
            printf("%d ",array[i]);
        }
        printf("
    ");
        return 0;
    }

     

    【归并排序】

    排序过程动图:

    C语言实现代码:

    #include<stdio.h>
    
    void merge(int *array,int left,int mid,int right)
    {
        int temp[right-left+1];
        int pos=0,lpos=left,rpos=mid+1;
        int i;
    /*分两个阶段考虑:
      ①左右两端都未遍历完——比较排序 
    ②有一边遍历完但另一边没有——将未遍历完的依次添加到排序数列后面
    最后将temp放入array*/
      while(lpos<=mid&&rpos<=right)
      { 
        
    if(array[lpos]<array[rpos])
        {
          temp[pos
    ++]=array[lpos++];
        }   
        
    else
        {  
           temp[pos
    ++]=array[rpos++];
        }
      }  
    //阶段①↑
    while(lpos<=mid) temp[pos++]=array[lpos++]; while(rpos<=mid) temp[pos++]=array[rpos++];
    //阶段②↑
    for(i=0;i<pos;i++) { array[i+left]=temp[i]; }
    }
    //归并过程 void mergesort(int *array,int left,int right) { int mid=(left+right)/2; if(left<right) //当left=right,返回上层进行merge() { mergesort(array,left,mid); mergesort(array,mid,right); merge(array,left,mid,right); } //递归 } int main() { int num; scanf("%d",&num); int array[num]; int i; for(i=0;i<num;i++) { scanf("%d",&array[i]); } mergesort(array,0,num-1); for(i=0;i<num;i++) { printf("%d ",array[i]); } printf(" "); return 0; }

    Properties ∠( ᐛ 」∠)_:

    最差时间复杂度 Theta(nlog n)
    最优时间复杂度 Theta(n)
    平均时间复杂度 Theta(nlog n)
    最差空间复杂度 Theta(n)

    【快速排序】

    Quick Sort是Bubble Sort改进方法。

    和归并一样用到分治思想。

    图示:

    C语言实现代码:

    #include<stdio.h>
    void quicksort(int *array,int from,int to)
    {
        if(from>=to)    return;
        int pivot=array[from];    //pivot就是划分数,即开头那个数啦(其实选哪个数做pivot随你啦)
        int i=from,j,temp;
        for(j=from+1;j<=to;j++)    //遍历pivot之后的数
        {
            if(array[j]<pivot)
            {        
                i=i+1;    //i在计数比pivot小的数的数量
                temp=array[i];
                array[i]=array[j];
                array[j]=temp;
            }
        }    //通过这个循环将划分区域内数按大小关系分成大于pivot和小于pivot两拨
        temp=array[i];
        array[i]=array[from];
        array[from]=temp;
        //将i位置与起始位置数值调换,将pivot换到中间值,原i位置是右边那拨最小数
        quicksort(array,from,i-1);
        quicksort(array,i+1,to);
        //递归,对pivot两边区域继续quicksort
    }
    
    int main()
    {
            int num;
            scanf("%d",&num);
            int array[num]; 
            int i;
            for(i=0;i<num;i++)
            {
                    scanf("%d",&array[i]);
            }
            quicksort(array,0,num-1); 
            for(i=0;i<num;i++)
            {
                    printf("%d ",array[i]);
            }
            printf("
    ");
            return 0;
    }

    其他堆排序什么的之后鞋数据结构再说吧QAQ

    我所理解的生活,就是和喜欢的一切在一起。
  • 相关阅读:
    对List进行子查询及分组
    网格数据库架构设计构想
    推荐一款简单实用的漏洞测试工具:Paros
    用友U9产品SOA设计架构遭技术质疑
    超简单使用MemCached
    不按常规出招
    如何学好AJax、求高手指点
    Begin
    SpringBoot基础
    SpringBoot基础学习(番外9.1)Spring MVC或Spring Boot配置默认访问页面不生效?
  • 原文地址:https://www.cnblogs.com/suzyc/p/5088215.html
Copyright © 2011-2022 走看看