各种插入函数收集整理

各种插入函数收集整理

插入排序

void InsertSort(int arr[], int length)    //无哨兵的插入排序 
{
	for(int i=1; i<length; i++)
	{
		if(arr[i] < arr[i-1])
		{
			int temp = arr[i];
			for(int j=i-1; j>=0 && arr[j]>temp; j--)
			{
				arr[j+1] = arr[j];
			}
			arr[j+1] = temp;
		}
	}
}


void InsertSort(int arr[], int length)   //有哨兵的插入排序 
{
	for(int i=1; i<=length; i++)
	{
		if(arr[i] < arr[i-1])
		{
			arr[0] = arr[i];
			for(int j=i-1; arj[j]>arr[0]; j--)
			{
				arr[j+1] = arr[j];
			}
			arr[j+1] = arr[0];
		}
	}
}

希尔排序

void shell_sort(int arr[], int length)
{
	int d = length / 2;
	while(d > 0)
	{
		for(int i=d; i<length; i++)
		{
			int temp = arr[i];
			int j = i - d;
			while(j >=0 && arr[j] > temp)
			{
				arr[j+d] = arr[j];
				j -= d;
			}
			arr[j+d] = temp;
		}
		d /= 2;
	}
}

选择排序

void SelectSort(int arr[], int length)    //简单选择排序 
{
	for(int i=0; i<length-1; i++)
	{
		k = i;
		for(int j=i+1; j<length; j++)   //从后面选择一个最小的记录 
		{
			if(arr[j] < arr[k])
				k = j;
		}
		if(k != i)    //与第i个记录交换 
			swap(arr[i], arr[k]);
	}
}

冒泡排序

void Bubble_Sort1(int arr[], int length)     //将小元素冒泡到最前面,首先操作小元素
{
	for(int i=0; i<length-1; i++)
	{
		for(int j=i+1; j<length; j++)
		{
			if(arr[j] < arr[i])
				swap(arr[i], arr[j]);
		}
	}
} 

void Bubble_Sort2(int arr[], int length)
{
	for(int i=0; i<length; i++)
	{
		for(int j=0; j<legnth-1-i; j++)
		{
			if(arr[j] > arr[j+1])
				swap(arr[j], arr[j+1]);
		}
	}
}


void Bubble_Sort3(int arr[], int length)
{
	int left = 0;
	int right = length - 1;
	while(left < right)
	{
		for(int i=left; i<right; i++)
			if(arr[i] > arr[i+1])
				swap(arr[i], arr[i+1]);
		
		--right;
		for(int j=right; j>left; j--)
			if(arr[j] < arr[j-1])
				swap(arr[j], arr[j-1]);
		++left;
	}
}

快速排序

int partition(int* arr, int low, int high)
{
	int pivo = arr[low];
	while(low < high)
	{
		while(low < high && arr[high] >= pivo)
			high--;
		arr[low] = arr[high];
		while(low < high && arr[low] <= pivo)
			low++;
		arr[high] = arr[low];
	}
	arr[low] = pivo;
	return low;
}
 
void qsort(int* arr, int low, int high)    //快排(递归) 
{
	if(low < high)
	{
		int index = partition(arr, low, high);
		qsort(arr, low, index-1);
		qsort(arr, index+1, high);
	}
}

void qsort_no_recursive(int* arr, int low, int high)   //快排 (非递归) 
{
	int pivo = partition(arr, low, high);
	stack<int> s;
	if(pivo - 1 > low)
	{
		s.push(low);
		s.push(pivo-1);
	}
	if(pivo + 1 < high)
	{
		s.push(pivo+1);
		s.push(high);
	}
	while(!s.empty())
	{
		high = s.top();
		s.pop();
		low = s.top();
		s.pop();
		int index = partition(arr, low, high);
		if(index - 1 > low)
		{
			s.push(low);
			s.push(index - 1);
		}
		if(index + 1 < high)
		{
			s.push(index + 1);
			s.push(high);
		}
	}
}

归并排序

void Merge(int arr[], int low,int mid, int high)
{
	int i = low, j = mid+1; 
	int k = 0;
	int* temp = (int*)malloc((high - low + 1) * sizeof(int));
	while(i <= mid && j <= high)
	{
		if(arr[i] < arr[j])    //进行排序存入动态分配的数组中 
			temp[k++] = arr[i++];
		else
			temp[k++] = arr[j++];
	}
	while(i <= mid)      //如果前一半还有未处理完的数据,按顺序移入动态分配的数组中 
		temp[k++] = arr[i++];
	while(j <= high)     //如果后一半还有未处理完的数据,按顺序移入动态分配的数组中 
		temp[k++] = arr[j++];
	for(i=low, j=0; i<=high; i++)
		arr[i] = temp[j++];
	free(temp);
}
 
void Msort(int arr[], int low, int high)
{
	if(low < high)
	{
		int mid = (low + high) >> 1;
		Msort(arr, low, mid);
		Msort(arr, mid+1, high);
		Merge(arr, low, mid, high);
	}
}

堆排序

void HeapAdjust(int arr[], int s, int m)
{
	int temp = arr[s];
	for(int i=2*s; i<=m ; i*=2)
	{
		if(i < m && arr[i] < arr[i+1])
			i++;
		if(temp >= arr[i])
			break;
		arr[s] = arr[i];
		s = i;
	}
	arr[s] = temp;
} 
 
void HeapSort(int arr[], int length)
{
	for(int i=length/2; i>=0; i--)
		HeapAdjust(arr, i, length-1);
	for(int i=length-1; i>0; i--)
	{
		swap(arr[i], arr[0]);
		HeapAdjust(arr, 0, i-1);
	}
}

作者:鼠标CS
来源:CSDN
原文:https://blog.csdn.net/hubeidaxuesanqi3012/article/details/65934951
版权声明:本文为博主原创文章,转载请附上博文链接!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114903.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python下mqtt服务器的搭建_搭建MQTT服务器

    python下mqtt服务器的搭建_搭建MQTT服务器就让我来试试传说中最适用于IOT的MQTT协议。安装虽然搜索资料很多,但大多是MQTT的使用,尽管有搭建服务器的文章,但我感觉写的不太清楚,大多数文章选择了Mosquitto(也许是Eclipse大厂出品的原因)。经过寻找,找到了Nodejs写的mosca,但在Pi上老是安装失败,翻了翻Issues,找到了同作者写的依赖性小,轻量化的aedes。npminstallaedes–save//…

    2022年5月8日
    508
  • 华为电脑如何投屏到电视linux,华为手机如何投屏到电脑上?手把手教你,无线投屏怎么做…「建议收藏」

    原标题:华为手机如何投屏到电脑上?手把手教你,无线投屏怎么做经常宅在家里想要看电影,手机屏幕太小影响观看体验,或者需要投屏到电脑上,方便办公。这个时候应该怎么办?如果你使用的是华为手机,可以直接投屏到电视、电脑上,这里就来手把手教你如何操作。1、打开功能华为手机开启无线投屏的方式有2种:第1种是在手机设置内,选择更多链接,进入之后就可以开启无线投屏的功能;第2种是直接下拉通知栏,然后开启手机投…

    2022年4月9日
    119
  • mysql解锁_mysql锁表如何解锁

    mysql解锁_mysql锁表如何解锁什么是MySQL锁表?为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制。MySQL有三种锁的级别:页级、表级、行级。MyISAM和MEMORY存储引擎采用的是表级锁(table-levellocking);BDB存储引擎采用的是页面锁(page-levellocking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-levellockin…

    2022年6月3日
    31
  • 简述控制反转ioc_什么是IoC控制反转

    简述控制反转ioc_什么是IoC控制反转静态类的使用是一个有争议的话题,有人甚至提倡不要在类的名称上使用作用域限定符。关于静态特性争论的焦点在于一个被称为IoC控制反转的设计原则。IoC这个设计原则试图在面向对象编程中去掉所有相互依赖的现象。这个原则对于复杂的系统来说是很重要的。它使得对象具有更好的多态性和封装性。相互依赖的现象越少,就越容易单独测试某个组件。静态类与IoC之间的问题在于静态访问特性,这个特性从本质上来说,定义了两个类之…

    2022年6月28日
    23
  • 蓝桥杯集锦04(python3)

    蓝桥杯集锦04(python3)

    2021年4月18日
    176
  • Navicat15激活码一直生成不了(注册激活)

    (Navicat15激活码一直生成不了)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlHQE565NV3W-eyJsaWNlbnNlSWQi…

    2022年3月28日
    396

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号