八大排序(一)插入排序(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>

void sort(int arr[], int len)
{
	int i, j, step, temp;		
	step = len/2;

	while(step >= 1)
	{
		for(i = step; i < len; i++)
		{
			temp = arr[i];
			j = i-step;
			if(arr[j] > temp)
			{
				arr[i] = arr[j];
				arr[j] = temp;
			}
		}
		step = step/2;
	}
}

int main()
{
	srand((unsigned)time(NULL));
	
	int arr[10] = {0};
	int i = 0;
	for(i = 0; i < 10; i++)
	{
		arr[i] = rand() % 100;
	}

	printf("排序前:\n");
	for(i = 0; i < 10; i++)
	{
		printf("%d ",arr[i]);
	}
	putchar(10);

	sort(arr, 10);
	
	printf("排序后: \n");
	for(i = 0 ; i < 10; i++)
	{
		printf("%d ",arr[i]);
	}
	putchar(10);

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值