八大排序(一)插入排序(C语言)

一、插入排序
(一)直接插入排序
1.向一组有序的数据中插入一个数;
2.默认第一个数据有序,将第一个数据以后的所有数据视为待排序数据,从待排序的数据中依次选取一个数据,对有序的数据从后向前遍历,直到找到第一个比要插入的数据小的数据,将该数后面的数据均向后移动一位,,将要插入的数据放在该数的后面,形成新的有序数列。直至将所有的数据均插入到数组中,则排序完成。代码如下:

#include <stdio.h>
int main()
{
    int arr[] = {14,56,21,19,26,85,67,93,66,34};			//待排序的数组
    int i, j, temp, len;
    len = sizeof(arr) / sizeof(int);						//获得数组中数的个数
    for(i = 1; i < len; i++)								//插入数据
    {
        temp = arr[i];
        j = i - 1;
        while(temp < arr[j] && j >= 0)
        {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j+1] = temp;
    }
    for(i = 0; i < len; i++)								//遍历排序后的数组
    {
        printf("%5d",arr[i]);
    }
    printf("\n");
    return 0;
}

(二)折半插入
折半插入排序是采用折半查找法来寻找插入位置的插入排序方法。
代码如下:

 #include <stdio.h>
    int main()
    {
        int arr[] = {14,56,21,19,26,85,67,93,66,34};		//待排序列
        int i, j, temp, len, up, low, mid;
        len = sizeof(arr) / sizeof(int);					//序列长度
        
        for(i = 1; i < len; i++)
        {
            temp = arr[i];
            low = 0;
            up = i - 1;
            while(low <= up)                                //查找插入位置
            {
                mid = (low + up) / 2;
                if(temp < arr[mid])
                {
                    up = mid - 1;
                }
                else
                {
                    low = mid + 1;
                }
            }
            
            for(j = i;j >= low + 1;j--) //插入点以后的数据均向后移动一位,空出插入位置											
            {															 
                arr[j] = arr[j - 1];
            }
            arr[low] = temp;                                //插入数据
        }
        
        for(i = 0; i < len; i++)							//遍历排序后的序列
        {
            printf("%5d",arr[i]);
        }
        printf("\n");
        return 0;
    }

(三)希尔排序
1、希尔排序利用了插入排序的简单,同时又避免了插入排序每次只能消除一个逆序对的缺点。希尔排序不是改变相邻元素,而是跳跃一段距离改变。
2、步长也称增量,是希尔排序中最有特色,且重要的概念;
它决定排序的分组,决定算法的优劣程度,与时间复杂度紧密相关;
代码如下:

#include <stdio.h>
int main()
{
    int arr[] = {14,56,21,90,26,85,67,8,12,65};			
    int i, j, step, temp, len;
    len = sizeof(arr) / sizeof(int);               //获取待排序列长度

    step = len / 2;	                               //初始步长

    while(step >= 1)							  //步长大于等于1循环
    {
        for(i = step; i < len; i++)				  //排序
        {
            temp = arr[i];
            j = i - step;
            while(temp < arr[j] && j >= 0) 		  //组内排序,寻找插入位置
            {
                arr[j + step] = arr[j];
                j = j - step;
            }
            arr[j + step] = temp;
        }
        step = step / 2;                         //步长变为原来的一半
    }

    for(i = 0; i < len; i++)				     //遍历排序后的结果
    {
        printf("%5d",arr[i]);
    }
    printf("\n");

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43499599/article/details/87938868