zoukankan      html  css  js  c++  java
  • 数组排序总结

    对经典的排序方法:冒泡排序、直接插入排序、直接选择排序、快速排序和归并排序做一个总结。

    //冒泡排序

    //基本思想:一次冒泡:

                       从第一个数开始,与后一个数进行比较,若前一个数大于(递增排序)后一个数,则交                      换位置,直至数组的倒数第二个数,共进行n-1次比较,最大数排序完成。

                       以此类推,直至最后一个数(最小数),比较一次即可完成。

    #include <stdio.h>  
    #include <malloc.h>
     //冒泡排序 
     
    void bubblesort(int a[],int n){
        int i,j,temp;
        int swap;
        for(i=n-1;i>0;i--){
            swap=0;
            for(j=0;j<i;j++){
                if(a[j]>a[j+1]){
                    temp=a[j];
                    a[j]=a[j+1];
                    a[j+1]=temp;
                    swap=1;
                }
            }
            if(swap==0){
                break;
            }
        }
    }
    
    int main(){
    int n,i;
    scanf("%d",&n);
    int* a;
    a=(int*)malloc(n);
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
        
    }
    bubblesort(a,n);
    for(i=0;i<n;i++){
        printf(" %d",a[i]);
    }
    free(a);
    } 
        

    //直接插入排序

    //基本思想:从第二个数开始,往前面的数组中插入数字。

                        对之前的数组进行检索,找到一个数它比要插入的数字大,且这个数字前一个数比要                       插入的数字小的位置。从这个数字的位置到要插入数组的数字的位置前一位进行后                           移,最后将要插入的数赋给这个位置。

    #include <stdio.h>  
    #include <malloc.h>
     //插入排序 
    void move(int a[],int first,int last){
        int i;
        for(i=last-1;i>=first;i--){
            a[i+1]=a[i];
        }
    }
    void insertsort(int a[],int n){
            int i,r,temp;
            for(i=2;i<n;i++){
                for(r=0;r<i;r++){
                       if((r!=0&&a[r]>=a[i]&&a[r-1]<a[i])||(r==0&&a[i]<a[0])){
                               temp=a[i];
                               move(a,r,i);
                               a[r]=temp;
                               break;
                    }
                }    
            }
        }
    
    
    int main(){
    int n,i;
    scanf("%d",&n);
    int* a;
    a=(int*)malloc(n);
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
        
    }
    insertsort(a,n);
    for(i=0;i<n;i++){
        printf(" %d",a[i]);
    }
    free(a);
    } 
        

    //选择排序

    //基本思想:在序列中挑出最小的与第一位数交换,再从第二位数开始的序列中再找出最小的与第                       二位数交换,依此进行,直至只剩一个数。

    #include <stdio.h>  
    #include <malloc.h>
     //选择排序 
    void selectsort(int a[],int n){
        int i,j;
        int min,k,temp;
        for(i=0;i<n-1;i++){
            min=a[i];
            k=i;
            for(j=i+1;j<n;j++){
                if(a[j]<min){
                    min=a[j];
                    k=j;
                }
            }
            if(k!=i){
                temp=a[i];
                a[i]=a[k];
                a[k]=temp;
            }
        }
    }
        
    
    
    int main(){
    int n,i;
    scanf("%d",&n);
    int* a;
    a=(int*)malloc(n);
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
        
    }
    selectsort(a,n);
    for(i=0;i<n;i++){
        printf(" %d",a[i]);
    }
    free(a);
    } 
        

    // 快速排序

    //基本思想:从第一个数开始,先从数组的末端开始找比它小的数,找到后,把这个数取出来(挖坑),再从数组的起始端开始找比它大的数,找到后,把这个数填到之前的坑里,再从填的坑往前找比它小的数,填坑....直到两端搜索碰到一块,这个点,把它放入。这个确定的点,将数组分成两块,对每块重复进行上述操作。

    #include <stdio.h>  
    #include <stdlib.h>  //快速排序 
    
    void quicksort(int a[],int first,int last){
        if(first<last){
        
        int i=first,j=last;
        int key=a[i];
        while(i<j){
            while(i<j&&a[j]>=key){
                j--;
            }
            if(i<j){
                a[i++]=a[j];
            }
            while(i<j&&a[i]<key){
                i++;
            }
            if(i<j){
                a[j--]=a[i];
            }
        }
        a[j]=key;
        
        quicksort(a,first,j-1);
        quicksort(a,j+1,last);
    }
    }
     
     
    int main(){
        int n;
        scanf("%d",&n);
        int* a;
        a=(int*)malloc(n);
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
        }
        quicksort(a,0,n-1);
        for(int r=0;r<n;r++){
            printf("%d",a[r]);
        }
        free(a);
        

    //归并排序

    //基本思想:分为并和归两步。并就是定义第三个数组,把两个排好的数组交替(判断大小)往里填,归就是把一个数组对半拆拆到每个数组只有一个数为止。

    #include <stdio.h>  
    #include <stdlib.h>  //归并排序
    
    void mergearray(int a[],int first,int mid,int last,int temp[]){
        int i=first,j=mid+1;
        int m=mid,n=last;
        int k=0;
        while(i<=m&&j<=n){
            if(a[i]<=a[j]){
                temp[k++]=a[i++];
            }
            else{
                temp[k++]=a[j++];
            }
        }
        while(i<=m){
            temp[k++]=a[i++];
        }
        while(j<=n){
            temp[k++]=a[j++];
        }
        for(i=0;i<k;i++){
            a[first+i]=temp[i];
        }
    }
    
    void mergesort(int a[],int first,int last,int temp[]){
         if(first<last){
             int mid=(first+last)/2;
             mergesort(a,first,mid,temp);
             mergesort(a,mid+1,last,temp);
             mergearray(a,first,mid,last,temp);
         }    
    }
     
     
    int main(){
        int n;
        scanf("%d",&n);
        int* a;
        a=(int*)malloc(n);
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
        }
        int* b;
        b=(int*)malloc(n);
        mergesort(a,0,n-1,b);
        for(int r=0;r<n;r++){
            printf("%d",b[r]);
        }
    } 
  • 相关阅读:
    java线程——三种创建线程的方式
    java线程——详解Callable、Future和FutureTask
    商品详情页系统的Servlet3异步化实践
    关于servlet3.0中的异步servlet
    Spring中线程池的应用
    Spring中@Async注解实现“方法”的异步调用
    高性能的关键:Spring MVC的异步模式
    SpringBoot+springmvc异步处理请求
    指定Qt程序运行的style,比如fusion(以前没见过QStyleFactory)
    Linux下获取arm的交叉编译工具链
  • 原文地址:https://www.cnblogs.com/Latticeeee/p/8144279.html
Copyright © 2011-2022 走看看