《算法导论》学习1-插入排序(insertion sort)

文章目录

  • 说明
    • 非降序排序1
    • 非降序排序2
    • 非升序排序1
    • 非升序排序2
    • 添加二分法
    • 总结

说明

以下是在学习《算法导论》的过程中所做笔记和整理,菜鸟级别,大神勿喷。

非降序排序1

以下代码是根据书中伪代码所编源码,该方式为非降序排序。

void insertionSort_1(int *a, int length)
{
    for(int j=1; j=0 && a[i] > key)
        {
            a[i+1] = a[i];
            i--;
        }

        a[i+1] = key;
    }
}

非降序排序2

以下代码是改写的从数组末尾开始排序的非降序排序:

void inserttionSort_2(int *a, int length)
{
	for(int j=length-2; j>=0; j--)
	{
		int key = a[j];
		int i = j + 1;
		while(i<=length-1 && a[i] < key)
		{
			a[i-1] = a[i];
			i++;
		}
		a[i-1] = key;
	}
}

非升序排序1

以下代码改写的非升序排序。

void insertionSort_3(int *a, int length)
{
    for(int j=1; j<length; j++)
    {
        int key = a[j];
        int i = j - 1;

        while(i>=0 && a[i] < key)
        {
            a[i+1] = a[i];
            i--;
        }

        a[i+1] = key;
    }
}

非升序排序2

以下代码是改写的从数组末尾开始的非升序排序。

void insertionSort_4(int *a, int length)
{
    for(int j=length-2; j>=0; j--)
    {
        int key = a[j];
        int i = j + 1;

        while(i<= length-1 && a[i] > key)
        {
            a[i -1] = a[i];
            i++;
        }

        a[i-1] = key;
    }
}

添加二分法

void insertionSort_5(int *a, int length)
{
    for(int j=1; j<=length-1; j++)
    {
        int key = a[j];
        int m = (j-1)/2;

        if(a[m] > key)
        {
            for(int t=j-1; t>=m; t--)
            {
                a[t+1] = a[t];
            }
            int i = m -1;
            while( i>=0 && a[i] > key)
            {
                a[i+1] = a[i];
                i--;
            }

            a[i+1] = key;
        }
        else
        {
            int i = j - 1;
            while(i>m && a[i] > key)
            {
                a[i+1] = a[i];
                i--;
            }
            a[i+1] = key;
        }
    }
}

总结

第一个是书中伪代码翻译的源码,其他三个在此基础上改写的代码。相同的是思想,不同只是操作的起始点和排序的规则不同。这几种实现在形式上,for循环完成数组中元素的遍历这一个操作,while循环完成找到判定的元素的插入位置并移动元素两个操作。从数组头开始的方法,与之对应的是for循环中j的计数是从小到大。从数组尾开始的方法,for循环中j的计数是从大到小。其中a[j]是取出来进行插入的元素,i的起始值对j有依赖,是数组中与j相邻的位于已排好序方向的元素的下标。while循环中元素与key比较之后移动方向也是往远离开始端的方向。

你可能感兴趣的:(笔记)