排序(Sort)--【一】

本文介绍了两种常见的排序算法:直接插入排序和希尔排序。直接插入排序是通过将每个元素插入到已排序部分的正确位置来实现排序,时间复杂度为O(N*N)。希尔排序则是一种改进的插入排序,通过设置间隔序列来减少元素移动次数,提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       排序,对于大家再熟悉不过了吧。我们之前在学习c语言的时候接触过的冒泡排序,选择排序等。今天给大家介绍两种新的排序。

1、直接插入排序


升序排列:将第一个数确定好,从下标为1的数开始插入,如果插入的数比前一个数大,就插入到前一个数后的位置。否则,将前一个数的位置后移,再与再往前的数比较,依次类推。

时间复杂度为:O(N*N)         最好情况:O(N)

主要实现代码(vs2013):

	#pragma once
	#include<iostream>
	using namespace std;


	void InsertSort(int *a,size_t size)
	{
		for(size_t i = 1; i < size; ++i)
		{
			int end = i-1;
			int tmp = a[i];
			while(end >= 0)
			{
				if(tmp < a[end]) //升序  //if(tmp > a[end]) //降序
				{
					a[end+1] = a[end];
					--end;
				}
				else
				{
					break;
				}
			}
			a[end+1] = tmp;
		}
	}
	void Display(int *a,size_t size)
	{
		for(size_t i = 0; i < size; ++i)
		{
			cout<<a[i]<<" ";
		}
		cout<<endl;
	}



	void TestInsert()
	{
		int a[] = {2,5,4,9,3,6,8,7,1,0};
		size_t size = sizeof(a)/sizeof(a[0]);
		InsertSort(a,size);
		Display(a,size);
	}

运行结果:



2、希尔排序

       当在插入排序中,数据特别多时,且不是有序的。这时采用插入排序就特别的慢。尤其是对于升序情况,所给的数据是降序,那么就需要每次挪动数据。这就显得效率比较低了。于是引入了希尔排序,将它们先排列的接近有序,再进行插入排序就容易多了。


主要实现代码(vs2013):

void ShellSort(int* a,size_t size)
{
	int gap = size;
	int end = 0;
	int tmp = 0;
	while(gap > 1)
	{
		gap = gap/3+1;
		for(size_t i = gap; i < size; ++i)
		{
			end = i-gap;
			tmp = a[i];
			while(end >= 0)
			{
				if(tmp > a[end])  //降序   //if(tmp < a[end]) 升序
				{
					a[end+gap] = a[end];
					end -= gap;
				}
				else
					break;
			}
			a[end+gap] = tmp;
		}
	}
}

void Display(int *a,size_t size)
{
	for(size_t i = 0; i < size; ++i)
	{
		cout<<a[i]<<" ";
	}
	cout<<endl;
}

void TestInsert()
{
	int a[] = {0,1,2,3,4,5,6,7,8,9};
	size_t size = sizeof(a)/sizeof(a[0]);
	ShellSort(a,size);
	Display(a,size);
}

运行结果:




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值