自己寫的一些排序算法

排序大全:

//直接選擇排序
void csort(int *a, int n)
{
        int j =0;       
        int tmp1;
        int tmp2;
        int i;
        for(i = 0; i<n; ++i){
                tmp1 = i;
                for(j =i+1; j<n; ++j){
                        if(a[tmp1] < a[j]) tmp1 = j;
                }
                tmp2 =a[i];
                a[i] = a[tmp1];
                a[tmp1] =tmp2;
        }
        return;
}

//直接插入排序
void insert_sort(int *a, int n)
{
        int i ;
        int j;
        int tmp;
        for(i =1;i< n;++i){
                tmp = a[i];
                for(j =i-1; j>=0; --j){
                        if(tmp < a[j]){
                                break;
                        }
                        a[j+1] = a[j];
                }
                ++j;
                a[j] = tmp;
        }
        return;
}
//        冒泡排序
void bubble_sort(int *a, int n)
{
        int i;
        int j;
        int tmp;
        for(i= n-1; i>=0; --i)
                for(j = 0; j<i; ++j){
                        if(a[j] < a[j+1]){
                                tmp = a[j];
                                a[j] = a[j+1];
                                a[j+1] = tmp;
                        }
                }
        return;
}

//shell 排序
//希爾排序
void shell_sort(int *a, int n)
{
        int i;
        int j;
        int k;
        int c;
        int m;
        int tmp;
        for(c = 10; c>= 1; --c)
                for(k = 0; k<c; ++k)
                        for(j = k+c; j < n; j += c){
                                tmp = a[j];
                                for(m = j-c; m>=0; m-=c){
                                        if(tmp<a[m]){
                                                break;
                                        }
                                        a[m+c] = a[m];
                                }
                                m += c;
                                a[m] = tmp;
                        }
        return;
}
 //歸併排序

void merge_sort(int *a ,int s,int e,int *v)
{
        if(e == s) return;
        merge_sort(a,s,(s+e)/2,v);
        merge_sort(a,(s+e)/2+1,e,v);
        int m = (s+e)/2;
        int i =s;
        int j =m+1;
        int o =s;
        while(i<=m && j<=e){
                if(a[i] < a[j]){
                        v[o++] = a[j++];
                }
                else{
                        v[o++] = a[i++];
                }
        }
        if(i>m && j<=e){
                for(;j<=e;++j){
                        v[o++] = a[j];
                }
        }
        else if(j>e && i<=m){
                for(;i<=m;++i){
                        v[o++] = a[i];
                }
        }
        for(int i= s; i<=e; ++i){
                a[i] = v[i];
        }
}

//堆排序
void heap_sort(int *a, int n)
{
        int f;        //father
        int l;        // left chilr
        int r;         //rught child
        int ff;        //father
        int ll;        // left chilr
        int rr;         //rught child
        int t;        //tmp
        int tt;        //tmp
        int which_c; //which child
        int m ;  // len when delete

       
        //build a heap
        f = (n)/2;
        while(f>=1){
                l = 2*f;
                r = 2*f+1;
                which_c = f;
                t = a[f-1];
                if(l <= n && t < a[l-1]){
                        t = a[l-1];
                        which_c = l;
                }
                if(r <= n && t< a[r-1]){
                        t = a[r-1];
                        which_c = r;
                }
                a[which_c -1] = a[f-1];
                a[f-1] = t;
               
                ff = which_c;
                while(ff <= n/2){
                        ll = 2*ff;
                        rr = 2*ff+1;
                        which_c = ff;
                        tt = a[ff-1];                       
                        if(ll<=n && tt< a[ll-1]){
                                tt = a[ll-1];
                                which_c = ll;
                        }
                        if(rr <= n && tt< a[rr-1]){
                                tt = a[rr-1];
                                which_c = rr;
                        }
                        if(which_c == ff) break;
                        else{
                                a[which_c -1] = a[ff-1];
                                a[ff-1] = tt;
                                ff =which_c;
                        }
                }
                --f;
        }
       
        for(int i =0 ;i<n; ++i){
                cout<<a[i]<<' ';
        }       
        cout<<endl;
        //delete the node
        for(tt = 0;tt< n; ++tt){
               
                t = a[n-1-tt];
                a[n-1-tt] = a[0];
                a[0] = t;
               
                f = 1;
                m = n-tt-1;
                while(f <= m/2){
                        l = 2*f;
                        r = 2*f+1;
                        which_c = f;
                        t = a[f-1];                       
                        if(l <= m && t< a[l-1]){
                                t = a[l-1];
                                which_c = l;
                        }
                        if(r <=  m && t< a[r-1]){
                                t = a[r-1];
                                which_c = r;
                        }
                        if(which_c == f) break;
                        else{
                                a[which_c -1] = a[f-1];
                                a[f-1] = t;
                                f =which_c;
                        }
                }
        }
}
//堆排序就是一個建立堆與刪除堆的過程

//快速排序
void quicksort(int *a, int s, int e)
{
        int i;
        int j;
        int m;
        int k;
        int tmp;
        int base;
        if(s>=e) return;
       
        i = s+1;
        j = e;
        base = a[s];
        while(j>=i){
                while(a[i]<=base && i<=j)++i;
                while(a[j]> base && j>=i)--j;
                if(i==j){
                        if(a[i] > base)--i;
                        break;
                }
                else if(i+1 ==j){
                        tmp = a[i];
                        a[i] = a[j];
                        a[j] = tmp;
                        break;
                }
                else if(i>j){
                        i = j;
                        break;
                }
                else{
                        tmp = a[i];
                        a[i] = a[j];
                        a[j] = tmp;
                        ++i;
                        --j;
                }
        }
        tmp = a[s];
        a[s] = a[i];
        a[i] = tmp;
       
        quicksort(a,s,i-1);
        quicksort(a,i+1,e);
       

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章