zoukankan      html  css  js  c++  java
  • 排序算法(总结)

    1. 冒泡排序

      算法思想:两两比较相邻的记录的关键字,如果反序则交换顺序,直到没有反序记录为止!

      算法实现:

    void BubleSort(int *a, int size)
    {
        int i, j;
        int flag = 1;//whether need sorted
        for(i = 0; (i < size - 1) && flag; i++)
        {
            flag = 0;
            for(j = size - 1; j > i; j--)
            {
                if(a[j-1] > a[j])
                {
                    printf("compare
    ");
                    int temp = a[j-1];
                    a[j-1] = a[j];
                    a[j] = temp;
                    flag = 1;
                }
            }
        }
    }

    2. 简单选择排序

      算法思想:选择排序的第 i 次是“选择”数组中第 i 小的记录,并将该记录放到数组的第 i 个位置。其独特之处在于从未排序的序列中找到第 i 小的关键码,而很少做记录的交换,前面部分是已排序的,后面部分是未排序的。

      算法实现:

    void selectSort(int *a, int size)
    {
        int i, j;
        int minIndex;
        for(i = 0; i < size; i++)
        {
            minIndex = i;
            for(j = i+1; j < size; j++)
            {
                if(a[j] < a[minIndex])
                    minIndex = j;
            }
            if(i != minIndex)
            {
                int temp = a[i];
                a[i] = a[minIndex];
                a[minIndex] = temp;
                printf("compare");
            }
        }
    }

    3. 直接插入排序,在基本有序队列中效率很高。

      算法思想:将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增加1的有序表。

      算法实现:

    void insertSort(int *a, int size)
    {
        int i, j, temp;
        for(i = 1; i < size; i++)
        {
            if(a[i] < a[i-1])
            {
                temp = a[i];
                for(j = i-1; j >= 0 && a[j] > temp; j--)
                {
                   a[j+1] = a[j];
                }
                a[j+1] = temp;
            }
            print(a, 8);
        }
    }

    4. 希尔排序

      算法思想:希尔排序利用了插入排序的最佳时间代价特性。希尔排序试图将待排序序列变成基本有序的,然后再用插入排序来完成最后的排序工作。

             希尔排序是这样来分组并排序的:将序列分成子序列,然后分别对子序列进行排序,然后将子序列组合起来。

      算法实现:

    void inssort2(int *a, int n, int incr)
    {
        int i, j;
        for(i = incr; i < n; i += incr)
        {
            for(j = i; (j >= incr) && (a[j] < a[j-incr]); j -= incr)
            {
                int temp = a[j];
                a[j] = a[j-incr];
                a[j-incr] = temp;
            }
        }
    }
    
    void shellSort(int *a, int size)
    {
        int i, j;
        for(i = size/2; i>2; i/=2)
        {
            for(j=0; j<i; j++)
            {
                inssort2(&a[j], size-j, i);
            }
            print(&a[0], size);
        }
        inssort2(a, size, 1);
    }

    5. 快速排序(迄今为止所有内排序算法中在平均情况下最快的一种)

      算法思想:首选选定一个基准数p,假设输入的数组中有k个小于p的结点,于是这些结点被放在数组最左边的k个位置上,而大于基准数p的结点被放在最右边的n-k个位置上。这称为数组的一个分割。在给定分割中的值不必被排序,只要求所有结点都放到正确的分组位置中。而基准数的位置就是下标k。快速排序再对基准数左右子数组分别进行类似的操作,其中一个子数组有k个元素,而另一个有n-k-1个元素。

      算法实现:

    void quickSort(int *a, int low, int high)
    {
        if(high <= low) return ;
        int i = low, j = high, x = a[i];
    
        while(i < j)
        {
            while(i < j && a[j] >= x)//从右往左找第一个小于x的数
                j--;
            if(i < j)
                a[i++] = a[j];
    
            while(i < j && a[i] < x)//从左往右找第一个大于x的数
                i++;
            if(i < j)
                a[j--] = a[i];
        }
    
        a[i] = x;
        print(a, 16);
        quickSort(a, low, i-1);
        quickSort(a, i+1, high);
    }
  • 相关阅读:
    HDU Problem 1811 Rank of Tetris【拓扑排序+并查集】
    POJ Problem 2367 Genealogical tree【拓扑排序】
    HDU Problem 2647 Reward【拓扑排序】
    HDU Problem 1285 确定比赛名次【拓扑排序】
    HDU Problem HDU Today 【最短路】
    HDU Problem 3665 Seaside【最短路】
    HDU Problem 一个人的旅行 【最短路dijkstra】
    HDU Problem 1596 find the safest road【最短路dijkstra】
    Beyond Compare文本合并进行内容替换要注意什么
    用这些工具都可以比较代码的差异
  • 原文地址:https://www.cnblogs.com/wiessharling/p/4343949.html
Copyright © 2011-2022 走看看