zoukankan      html  css  js  c++  java
  • 常用排序算法

    参考如下链接:

    http://blog.csdn.net/hguisu/article/details/7776068

    #include <iostream>
    #include <memory.h>
    using namespace std;
    
    void print(int a[], int n){
        for(int j= 0; j<n; j++){
            cout<<a[j] <<"  ";
        }
        cout<<endl;
    }
    
    //直接插入排序
    void InsertSort(int a[], int n)
    {
        int i, j, tmp;
        for (i = 1; i < n; ++i)
        {
            if (a[i] < a[i - 1])
            {
                tmp = a[i];
                for (j = i - 1; j >= 0 && tmp < a[j]; --j)
                {
                    a[j + 1] = a[j];
                }
                a[j + 1] = tmp;
            }
        }
        return;
    }
    
    void InsertSort1(int a[], int n)
    {
        int i, j, tmp;
        for (i = 1; i < n; ++i){
            tmp = a[i];
            for (j = i; j > 0 && tmp < a[j - 1]; --j){
                a[j] = a[j - 1];
            }
            a[j] = tmp;
        }
        return;
    }
    
    //希尔排序
    void ShellSort(int a[], int n)
    {
        int i, j, tmp, increment;
        for (increment = n / 2; increment > 0; increment /= 2)
        {
            for (i = increment; i < n; ++i)
            {
                if (a[i] < a[i - increment])
                {
                    tmp = a[i];
                    for (j = i; j >= increment; j -= increment)
                    {
                        if (tmp < a[j - increment])
                        {
                            a[j] = a[j - increment];
                        }
                        else
                        {
                            break;
                        }
                    }
                    a[j] = tmp;
                }
    
            }
        }
        return;
    }
    
    //选择排序
    void SelectSort(int a[], int n)
    {
        int min = 0;
        int tmp = 0;
        for (int i = 0; i < n; ++i){
            min = i;
            for (int j = i + 1; j < n; ++j){
                if (a[j] < a[min]){
                    min = j;
                }
            }
            if (min != i){
                tmp = a[min];
                a[min] = a[i];
                a[i] = tmp;
            }
        }
        return;
    }
    
    //二元选择排序
    void TwoSelectSort(int a[], int n)
    {
        int i = 0;
        int j = 0;
        int min = 0;
        int max = 0;
        int tmp = 0;
        for (i = 0; i <= n / 2; ++i){
            min = i;
            max = i;
            for (j = i + 1; j < n - i; ++j){
                if (a[j] < a[min]){
                    min = j; continue;
                }
                if (a[j] > a[max]){
                    max = j; 
                }
            }
            if (min != i){
                tmp = a[min];
                a[min] = a[i];
                a[i] = tmp;
            }
            if (max != i){
                tmp = a[max];
                a[max] = a[n - i - 1];
                a[n - i - 1] = tmp;
            }
        }
        return;    
    }
    
    //堆排序
    void PercDown(int a[], int i, int n)
    {
        int tmp = 0;
        int child = 2 * i;
        for (tmp = a[i]; 2 * i + 1 < n; i = child){
            child = 2 * i;
            if (child != n - 1 && a[child + 1] > a[child]){
                ++child;
            }
            if (tmp < a[child]){
                a[i] = a[child];    
            }
            else {
                break;
            }
        }
        a[i] = tmp;
        return;
    }
    
    void HeapSort(int a[], int n)
    {
        int tmp = 0;
        for (int i = n / 2; i >= 0; --i){
            PercDown(a, i, n);
        }
        for (int i = n - 1; i > 0; --i){
            tmp = a[0];
            a[0] = a[i];
            a[i] = tmp;
            PercDown(a, 0, i);
        }
        return;
    }
    
    //归并排序
    void Merge(int a[], int t[], int i, int m, int n)
    {
        int pos = i;
        int j = m + 1;
        int length = n - i + 1;
        int start = i;
        while (i <= m && j <= n){
            if (a[i] <= a[j]){
                t[pos++] = a[i++];
            } else {
                t[pos++] = a[j++];
            }
        }
        while(i <= m){
            t[pos++] = a[i++];
        }
        while(j <= n){
            t[pos++] = a[j++];
        }
        memcpy(&a[start], &t[start], length * sizeof(int));
        return;
    }
    
    void MSort(int a[], int t[], int i, int n)
    {
        if (i < n){
            int m = (i + n) / 2;
            MSort(a, t, i, m);
            MSort(a, t, m + 1, n);
            Merge(a, t, i, m, n);
        }
        return;
    }
    
    void MergeSort(int a[], int n)
    {
        int *t = new int[n];
        if (NULL != t){
            MSort(a, t, 0, n - 1);
            print(t, n);
            delete []t;
        } else {
            cout<<"malloc error!"<<endl;
        }
        return;
    }
    
    //快速排序
    void Swap(int *a, int *b)
    {
        int tmp = 0;
        tmp  = *a;
        *a = *b;
        *b = tmp;
        return;
    }
    
    int Median3(int a[], int left, int right)
    {
        int center = (left + right) / 2;
        if (a[left] > a[center]){
            Swap(&a[left], &a[center]);
        }
        if (a[left] > a[right]){
            Swap(&a[left], &a[right]);
        }
        if (a[center] > a[right]){
            Swap(&a[center], &a[right]);
        }
        Swap(&a[center], &a[right - 1]);
        return a[right - 1];
    }
    
    void Qsort(int a[], int left, int right)
    {
        int i, j;
        int pivot;
        if (left + 3 <= right){
            pivot = Median3(a, left, right);    
            i = left;
            j = right - 1;
            for (;;){
                while(a[++i] < pivot){}
                while(a[--j] > pivot){}
                if (i < j){
                    Swap(&a[i], &a[j]);
                } else {
                    break;
                }
            }
            Swap(&a[i], &a[right - 1]);
            Qsort(a, left, i -1);
            Qsort(a, i + 1, right);
        } else {
            InsertSort(a + left, right - left + 1);
        }
        return;
    }
    
    int main()
    {
        int a[9] = {34, 18, 12, 4, 1, 99, 178, 9, 37};
        //InsertSort1(a, 9);
        //ShellSort(a, 9);
        //TwoSelectSort(a, 9);
        //HeapSort(a, 9);
        //MergeSort(a, 9);
        Qsort(a, 0, 8);
        print(a, 9);
        return 0;
    }
  • 相关阅读:
    Ajax的基本使用
    Jquery--动画
    JQuery基础(选择器、事件、DOM操作)
    LinQ 创建连接、简单增删改查
    分页查询/组合查询
    分页查询、组合查询
    JavaScript
    WebForm Response和Request以及Cookie
    Response、Request、QueryString,修改,Cookies
    Repeater
  • 原文地址:https://www.cnblogs.com/libin2015/p/5207501.html
Copyright © 2011-2022 走看看