插入排序

2021-01-07 22:29

阅读:485

标签:cout   参考   排序   部分   默认   取数   while   现在   长度   

直接插入排序

将待排序列分为已排序序列和未排序序列,不断取出未排序序列中的元素放入已排序序列中合适的位置(指放之后已排序序列仍然有序)。下面的例子中,是一个待排的数组arr,先将0位置的元素认为是一个有序序列,1~len(arr)-1为无序,慢慢从1开始取元素加入有序部分,直到所有数组元素有序。

#include 

using namespace std;

void insert_sort(int arr[], int len)
{
    int temp, i, j;
    for(i = 1; i =0 && arr[j]>k)       //在已排序序列内,查找k的大小位置
        {
            arr[j+1] = arr[j];       //将元素后移,为k腾出空位
            j--;                     //在已排序序列内,由后向前循环
        }
        arr[j+1] = temp;                //将需要排序的元素放到腾出的空位上
    }
}

int main()
{
    int arr[] = {7, 1, 4, 8, 3, 2};
    int len = sizeof(arr)/sizeof(int);
    for(int i = 0; i 

折半插入排序

在将一个新元素插入已排好序的数组的过程中,寻找插入点时,待插序列的首元素为arr[low],末元素为arr[high],比较时将待插入元素与arr[mid](mid=(low+high)/2)相比较,如果比参考元素大,则选择arr[low]到arr[m-1]为新的插入区域(即high=mid-1),否则选择arr[mid+1]到arr[high]为新的插入区域(即low=mid+1),如此直至low

#include 

using namespace std;

void binary_insert_sort(int arr[], int len)
{
    int k, i, j;
    int low, high, mid;
    for(i = 1; i = high+1 ; j--)       //元素会插在arr[high+1]这个位置,而从high到i-1的元素会后移
        {
            arr[j+1] = arr[j];
        }
        arr[j+1] = k;
    }

}

int main()
{
    int arr[] = {7, 1, 4, 8, 3, 2};
    int len = sizeof(arr)/sizeof(int);
    for(int i = 0; i 

希尔排序

又称为缩小增量排序。基本思路是将待排序列分割成若干个子序列,对每个子序列进行排序,然后缩小分割量(比如原本每隔4个元素为一组,现在变为2个),继续对缩小后的子序列排序,直到最后分割量为1。

#include 

using namespace std;

void shell_sort(int arr[], int len)
{
    int gap;          //步长
    int i, j;
    for(gap = len / 2; gap > 0; gap = gap / 2)        //先取数组arr长度的一半,然后每次变为上次的1/2。
    {
        for(i = gap; i = 0 && arr[j] > temp)
                {
                    arr[j+gap] = arr[j];
                    j = j - gap;
                }
                arr[j+gap] = temp;
            }
        }
    }
}

int main()
{
    int arr[] = {7, 1, 4, 8, 3, 2};
    int len = sizeof(arr)/sizeof(int);
    for(int i = 0; i 

注意点:从上面shell_insert()函数中截取一段(也是注释里需要注意那块),如下。

for(i = gap; i 

排序并不是将某个子序列完全排完,再下一个子序列。而是所有子序列轮着来orz

插入排序

标签:cout   参考   排序   部分   默认   取数   while   现在   长度   

原文地址:https://www.cnblogs.com/echobiscuit/p/12968900.html


评论


亲,登录后才可以留言!