各种插入函数收集整理

各种插入函数收集整理

插入排序

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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【已解决】罗技K380蓝牙键盘可以连接电脑,但无法输入怎么办?[通俗易懂]

    【已解决】罗技K380蓝牙键盘可以连接电脑,但无法输入怎么办?[通俗易懂]【问题】罗技k380可以连接并正常使用平板、手机。电脑显示着已连接,但就是无法输入。之前是可以用的,最近需要频繁配对突然不能用了。网上的各种方法都不好使,问京东客服也解决不了准备申请售后。【解决方案】后来仔细看了下k380使用方法,发现Fn+F1可以重置键盘的蓝牙设备,于是在电脑删除了k380蓝牙设备后,在蓝牙键盘上进行了Fn+F1重置,最后进行重启配对就ok了。可能是频繁配对让键盘有了缓存错误了。

    2022年10月16日
    3
  • springEL表达式_赋值表达式的条件

    springEL表达式_赋值表达式的条件一、SpEL介绍二、SpEL用法1.在@Value注解中使用2.在XML配置中使用3.在代码中创建Expression对象三、SpEL原理1.解析器:ExpressionParser2.表达式:Expression3.上下文:EvaluationContext使用流程四、表达式语法1.基本表达式①字面量表达式②算数运算表达式③关系运算表达式④逻辑运算表达式⑤字符串连接及截取表达式⑥三目运算⑦Elivis表达式⑧正则表达式2.类相关表达式

    2025年10月28日
    3
  • mac phpstrom 激活码【2022最新】「建议收藏」

    (mac phpstrom 激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html4KDDGND3CI-eyJsa…

    2022年4月1日
    108
  • 什么是渗透_mitotracker deep red

    什么是渗透_mitotracker deep red0x00简介Mimikatz是一款功能强大的轻量级调试神器,通过它你可以提升进程权限注入进程读取进程内存,当然他最大的亮点就是他可以直接从lsass.exe 进程中获取当前登录系统用

    2022年8月6日
    9
  • 博客数据库被删,丢失部分数据!

    博客数据库被删,丢失部分数据!

    2021年8月11日
    50
  • Bug.PotPlayer播放视频上下、左右翻转

    Bug.PotPlayer播放视频上下、左右翻转2018/8/8 PotPlayer作为一款全能、绿色的视频播放器倍受喜爱。在使用中偶尔可能会出现播放视频上下倒置、左右翻转的情况,一时让人摸不着头脑。其实是误触了快捷键导致图像颠倒,再次按下快捷键即可恢复。上下倒置的情况,这时在播放界面按下“Ctrl+V”快捷键;界面左上角提示“图像上下翻转:关闭”,视频播放恢复正常。左右翻转时,如果无字幕其实并不影响观看;这时按下快捷键“Ctrl+…

    2022年5月12日
    168

发表回复

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

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