• 基本排序算法学习


    排序有关博客:

    http://www.cnblogs.com/vamei/archive/2013/03/12/2948847.html

    http://blog.csdn.net/morewindows/article/details/6665714

    排序动画(推荐):http://www.sorting-algorithms.com/insertion-sort

    1.插入排序

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

    操作过程:先将序列中的第一个记录看成是一个有序的子序列,然后从第二个记录开始逐个进行插入,直至整个序列有序。

    空间复杂度O(1),时间复杂度O(n2)(取决于原先序列排序情况,最小n-1,最大(n+4)(n-1)/2)

    void InsertSort( int a[], int n)
    {
        //假设序列a[i]为已经排好序(从小到大);
        //在后面的序列a[i+1]--a[n-1]中的每个元素与a[i]比较,如果比a[i]小,则交换位置。
        //直到所有的元素都已经交换过位置
        int i = 0,j = 0;
        int temp; 
        for( i = 1; i < n; i++) //从序列中的第二个元素开始(假定第一个元素为已经排好序的子序列)
        {
            temp = a[i]; //缓存将要与自序列中的元素进行比较的元素a[i];
            for(j = i; j > 0 && a[j - 1] > temp; j--)
            {
                a[j] = a[j-1]; //将大于temp的元素向后移动一个位置
            }
            a[j] = temp;
        }
    }

     2.希尔排序

    改进版的插入排序,通过比较相隔一定距离的元素;各趟比较所用的距离随着算法的进行而减小,知道只比较相邻的元素的最后一趟排序为止。

    空间复杂度:希尔排序的时间复杂度与增量的选取有关。

    void ShellSort( int a[], int n)
    {
        int i,j, Increment;
        int temp;
        for(Increment = n / 2; Increment > 0; Increment /= 2)
        {
            for( i = Increment; i < n; i++)
            {
                temp = a[i];
                for( j = i; j >= Increment; j -= Increment )
                {
                    if(temp < a[ j - Increment] )
                        a[j] = a[j - Increment];
                    else
                        break;
                }
                a[j] = temp;
            }
        }
    }

     3.冒泡排序

    思想:

    (1)将待排序数组a[n]前后两个数据比较,大的放后面。

    (2)经过上面一轮循环后,最大的元素沉到了底部。下一轮循环不用比较最后的一个元素,因为已经确定是最大的。

    (3)重复上面的步骤。

    void BubbleSort(int a[], int n)
    {
        int sign = 0;
        for(int i = 0; i < n; i++)
        {
            for(int j = 1; j < n-i; j++)
            {
                if(a[j-1] > a[j])
                {
                    swap(a[j-1], a[j]);
                    sign = 1;
                }
            }
            if(sign == 0) break;
        }
    }
    void swap(int *a, int *b)
    {
        int temp;
        if(*a > *b)
        {
            temp = *a;
            *a = *b;
            *b = temp;
        }    
    }
  • 相关阅读:
    java中Array/List/Map/Object与Json互相转换详解
    推荐几款开源的js日期控件
    12款优秀的 JavaScript 日历和时间选择控件
    12款优秀的 JavaScript 日历和时间选择控件
    StringTokenizer(字符串分隔解析类型)
    StringTokenizer(字符串分隔解析类型)
    javascript中的undefined 和 not defined
    javascript中的undefined 和 not defined
    6.静态函数库设计
    5. Linux应用程序地址布局
  • 原文地址:https://www.cnblogs.com/mrethan/p/4631193.html
Copyright © 2020-2023  润新知