查找与排序-创新互联

查找和排序都是程序中经常用到的算法

成都创新互联专注于贵州企业网站建设,成都响应式网站建设公司,商城系统网站开发。贵州网站建设公司,为贵州等地区提供建站服务。全流程按需网站设计,专业设计,全程项目跟踪,成都创新互联专业和态度为您提供的服务

 一、查找

    查找分为:顺序查找,二分查找、哈希表查找和二叉树排序查找。

    哈希表和二叉树查找的重点在于其数据结构。哈希表的主要优点是能够在O(1)的时间查找某一元素,是效率最高的查找方式。其缺点是需要额外的空间来实现哈希表。

二、排序

    排序分为插入排序,交换排序,选择排序归并排序等。排序的这几种方法的优劣(额外空间的消耗,平均时间复杂度和最差时间复杂度)、特点是重点。

1.插入排序

a.直接插入

当给定的数据元素序列有序时,关键字之间比较次数最少,最好的情况下时间复杂度为O(N),最差的情况下为O(N^2)

void InSertSort(int*a, int length)
{
	for (int i = 1; i < length; i++)
	{
		int tmp = a[i];
		int j = 0;		
		for ( j = i-1; j >=0&&tmp<a[j];j--)//当后面无序的元素小于有序的元素时,将那个有序的元素到要排序的这个元素整体后移后移
		{
			a[j + 1] = a[j];
		}
		a[j+1] = tmp;
	}
}

插入排序是最稳定的排序方法

b.折半插入

和直接插入排序过程相似,用折半的方法寻找插入位置。

void BiInsertSort(int *a, int length)
{
	for (int i = 1; i < length; i++)
	{
		int tmp = a[i];
		int left = 0;
		int right = i - 1;
		int j = 0;

		while (left <= right)
		{
			int mid = (left + right);
			if (tmp < a[mid])//折半
			{
				right = mid - 1;
			}
			else
			{
				left = mid + 1;
			}
		}
		for (j = i - 1; j >= left; j--)//后移
		{
			a[j + 1] = a[j];
		}
		a[j + 1] = tmp;
	}
}

2.交换排序

    两两比较,若发现存在逆序,则交换,一直待到元素序列没有逆序为止

a.冒泡排序

时间复杂度为O (n^2) 是稳定的排序方法

void BubbleSort(int *a, int length)
{
	for (int i = 0; i < length; i++)
	{
		for (int j = 0; j < length - i-1; j++)
		{
			if (a[j]>a[j + 1])
				swap(a[j], a[j + 1]);
		}
	}
}

b.快速排序

1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;

2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];

3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;

4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;

5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

int Partition(int *a, int i, int j)
{
	int base = a[i];
	while (i < j)
	{
		//从右往左扫描
		while (base < a[j] && i<j)
			j--;
		if (i<j)//经过上一步while循环,a[i]>a[j]
		{
			swap(a[i], a[j]);
			i++;
		}
		//从左往右扫描
		while (i<j && base>a[i])
			i++;
		if (i<j)
		{
			swap(a[i], a[j]);
			j--;
		}
	}
	a[i] = base;
	return i;
}
void QuickSort(int *a, int start, int end)
{
	int index=0;
	if (start < end)
	{
		index = Partition(a, start, end);
		QuickSort(a, start, index - 1);
		QuickSort(a, index + 1, end);
	}
}

3.选择排序

a.直接选择排序

b.堆排序

快速排序

    快速排序关键在于先在数组中选择一个数字,接下来吧数组中的数字分为两部分,比选择数组小的放到左边,大的放到右边。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。

当前标题:查找与排序-创新互联
当前网址:https://www.cdcxhl.com/article20/jgoco.html

成都网站建设公司_创新互联,为您提供自适应网站静态网站全网营销推广品牌网站设计云服务器网站维护

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

绵阳服务器托管