基本排序

#include 
#include 

int b[11111];
int num[11111];

//归并排序
void mergeSort(int *a, int l, int r){
    if(r-l<= 1)
        return;
    int mid= (l+ r)/2;
    mergeSort(a, l, mid);
    mergeSort(a, mid, r);
    int p= l, q= mid;
    int i= l;
    while (p< mid || q< r){
        if(q>= r)
            b[i++]= a[p++];
        else if(p>= mid || a[p]> a[q])
            b[i++]= a[q++];
        else
            b[i++]= a[p++];
    }
    for (int j= l; j< r; j++) {
        a[j]= b[j];
    }
}

//插入排序
void insertSort(int *a, int l, int r){
    for(int i= l+1; i< r; i++){
        int temp= a[i];
        for(int j= i-1; j>= l; j--)
            if(a[j]> temp){
                a[j+1]= a[j];
                a[j]= temp;
            }
    }
}

//选择排序
void selectSort(int *a, int l, int r){
    for (int i= l; i< r; i++)
        for (int j= i+1; j< r; j++)
            if(a[i]> a[j]){
                a[i]= a[i]^a[j];
                a[j]= a[i]^a[j];
                a[i]= a[i]^a[j];
            }
}

//希尔排序
void shellSort(int *a, int l, int r){
    int gap= 0;
    while (gap <= r-l)
        gap= gap*3+ 1;
    
    //这里用直接插入排序
    while (gap) {
        for(int i= l; i< l+gap ; i++){
            int j= i+ gap;
            while(j< r){
                int temp= a[j];
                for(int k= j- gap; k>= l; k-= gap)
                    if(a[k]> temp){
                        a[k+ gap]= a[k];
                        a[k]= temp;
                    }
                j+= gap;
            }
        }
        gap= (gap- 1)/3;
    }
}

//冒泡排序
void buddleSort(int *a, int l, int r){
    for (int i= l; i< r- 1; i++)
        for(int j= l; j< r- 1; j++)
            if (a[j]> a[j+1]) {
                int temp= a[j];
                a[j]= a[j+1];
                a[j+1]= temp;
            }
}

//快速排序
void quickSort(int *a, int l, int r){
    if(r- l<= 1)
        return;
    int key= a[l], i= l, j= r- 1;
    while(i< j){
        while (i< j && a[j]>= key)
            --j;
        int temp= a[i];
        a[i]= a[j];
        a[j]= temp;
        
        while (i< j && a[i]<= key)
            ++i;
        temp= a[i];
        a[i]= a[j];
        a[j]= temp;
    }
    quickSort(a, l, i);
    quickSort(a, i+1, r);
}



//堆排序

void mySwap(int *a, int *b){
    int temp= *a;
    *a= *b;
    *b= temp;
}


void heapChang(int *a, int i, int len){
    int child= 2* i+ 1;

    while (child < len) {
        if(child+ 1< len)
            if(a[child]< a[child+ 1])
                ++child;
        if(a[i]>=  a[child])
            break;
        mySwap(a+i, a+child);
        i= child;
        child= 2* i+ 1;
    }
}

void heapSort(int *a, int *b){

    int len= (b- a);
    for(int i= (len-1)/2; i>= 0; i--)
        heapChang(a, i, len);
    mySwap(a, b-1);
        
    //进行n-1次堆调整
    for(int i= 1; i< len; i++){
        heapChang(a, 0, len-i);
        mySwap(a, b-i-1);
    }
}


int main(int argc, const char * argv[]) {
    int n;
    
    while (scanf("%d",&n)!=EOF) {
        for(int i= 1; i<= n; i++)
            scanf("%d",&num[i]);
        //mergeSort(num, 1, n+1);
        //insertSort(num, 1, n+1);
        //selectSort(num, 1, n+1);
        //shellSort(num, 1, n+1);
        //buddleSort(num, 1, n+1);
        //quickSort(num, 1, n+1);
        heapSort(num+1, num+n+1);
        printf("%d\n",num[1+n/2]);
    }
    return 0;
}



你可能感兴趣的:(基本排序)