zoukankan      html  css  js  c++  java
  • 常见的排序算法——插入排序

    插入排序的思想:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子数组中的适当位置,直到全部记录插入完成为止。

    一、直接插入排序

    #include <iostream>
    using namespace::std;
    
    //打印
    void print_array(int a[], int n)
    {
        for(int i = 0; i < n; i++)
            cout << a[i]  << "," ;
        cout << endl;
    }
    
    //排序
    void insert_sort(int a[], int n)
    {
        int tmp = 0;
        int j = 0;
        
        for(int i = 1; i < n; i++)
        {
            //暂存下标为i的数,下标从1开始,因为a[0]已经排好序
            tmp = a[i];
            for(j = i - 1; j >= 0 && tmp < a[j]; j--)
            {
                //发现a[i]比前面的a[j]小,就把a[j]往后挪,再将tmp=a[i]放在合适的位置
                a[j+1] = a[j];
            }
            //放入tmp=a[i]
            a[j+1] = tmp;
            print_array(a, n);
        }
    }
    
    int main()
    {
        int a[] = {7,3,5,8,9,1,2,4,6};
        cout << "before sort:" << endl;
        print_array(a, 9);
    
        insert_sort(a, 9);
        cout << "after sort :" << endl;
        print_array(a, 9);
        
        return 0;
    }

    输出:

    说明:

      直接插入排序的做法是:每次从无序表中取出第一个元素,插入到有序表的合适位置。第一次比较前两个数,把较大的放在后面;第二次取第三个数与前两个数从后往前扫描,然后插入到合适的位置;依次下去进行了(n-1)次扫描完成了整个过程。

      直接插入排序属于稳定排序,最坏时间复杂性为O(n^2),空间复杂度O(1)。

    二、希尔(Shell)排序

    #include <iostream>
    using namespace std;
    
    void print_array(int a[], int n)
    {
        for(int i = 0; i < n; i++)
            cout << a[i]  << "," ;
        cout << endl;
    }
    
    void shell_sort(int a[], int n)
    {
        int tmp = 0, j = 0;
        //h是每次循环的增量,依次减半
        for(int h = n / 2; h > 0; h /= 2)
        {
            for(int i = h; i < n; i++)
            {
                tmp = a[i];
                for(j = i - h; (j>=0 && tmp < a[j]); j-=h)
                {
                    a[j+h] = a[j];
                }    
    cout << "before:  " << tmp << "  ";
                print_array(a, 9);
                a[j+h] = tmp;
    cout << "after :  " << "   ";
                print_array(a, 9);
            }
        }    
    }
    
    
    int main()
    {
        int a[] = {7,3,5,8,9,1,2,4,6};
        //cout << "before sort:" << endl;
        print_array(a, 9);
    
        shell_sort(a, 9);
        //cout << "after sort :" << endl;
        print_array(a, 9);
        
        return 0;
    }

    输出:

    说明:

      希尔排序是插入排序的一种。是针对直接插入排序的改进。又称为缩小增量排序,属于不稳定排序方法。

      在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,且对插入的下一个数没有帮助。如果比较相隔较远(增量大)的数,使得数移动能跨过多个元素,就可以避免多次交换了。

      希尔排序算法是将数组按照增量d分成若干组,组之间对应元素进行比较,然后交换;然后将增量缩小,再次进行分组,组之间对应元素进行比较,直到增量变为1。因此希尔排序实际上是一种分组插入方法。

     

  • 相关阅读:
    基本类型和包装类对象使用 == 和 equals进行比较的结果?
    ==和equals的区别是什么?
    JDK和JRE有什么区别?
    Java自学指南三、入门视频优先
    Java自学指南二、后端开发全景图与快速入门
    Java自学指南一、找一个开始并能坚持下去的理由
    什么是&#160;happens-before 原则?
    什么是 Java 内存模型?
    Java 中有哪些无锁技术来解决并发问题?如何使用?
    什么是活锁和饥饿?
  • 原文地址:https://www.cnblogs.com/Brickert/p/10757150.html
Copyright © 2011-2022 走看看