数组排序总结

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

 

//冒泡排序

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

                   从第一个数开始,与后一个数进行比较,若前一个数大于(递增排序)后一个数,则交                      换位置,直至数组的倒数第二个数,共进行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]);
    }
} 

 

posted @ 2017-12-29 14:18  Latticeeee  阅读(237)  评论(0编辑  收藏  举报