• 排序算法(总结)


    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);
    }
  • 相关阅读:
    SCOI 2012 滑雪与时间胶囊
    TYVJ P1730 二逼平衡树
    CDQZ_Training 20120524 词编码
    VC++学习笔记之消息处理机制和窗口过程函数
    项目管理本质论
    VC++学习笔记之创建窗口
    C++随笔(二)
    SqlServer的那些常用操作(一)
    C++随笔(一)
    Silverlight游戏开发学习笔记(二)
  • 原文地址:https://www.cnblogs.com/wiessharling/p/4343949.html
Copyright © 2020-2023  润新知