排序算法(1)

1 篇文章 0 订阅
1 篇文章 0 订阅
自我阐述下原因,因近期找工作特别需要,整理下这两天摸索的算法。说来也是难过,都大四毕业了两个基本的算法还弄了好久。望大佬路过体谅!
步入正题,今天介绍下自己新理解的两个算法(中途因为途中少了个判断左端点小于右端点琢磨了一晚上(当然问题指定是出在快排上,冒泡还是没啥问题的),今早才解决,比较难过~~~,菜鸡如我!)今天介绍下两个自我学习的排序—冒泡+快排。当做个自我记录吧,加深下印象也不错的!(注:PHP版)

一、冒泡排序

小结一下吧,我觉得冒泡的话就是每一次都将最大的那个数放到最右边(从小到大型排序),所以,每遍历一遍内循环就少了一次最右边数的遍历(因为每次最后一个数已是当前最大),于是乎算法就出来了。
# 主算法,冒泡
function bubbleSort(&$arr){
	$arrLen = count($arr);
	# 外层遍历整个数组
	for($i=0;$i<$arrLen-1;$i++){
		# 内层每次遍历未排好序的前$arrLen-1-$i个元素
		for($j=0;$j<$arrLen-1-$i;$j++){
			# 若前一个元素比后一个大,马上交换
			if($arr[$j] > $arr[$j+1]){
				swap($arr,$j,$j+1);
			}
		}
	}
}
# 交换两个元素,这个没啥说的
function swap(&$arr,$left,$right){
	$temp = $arr[$left];
	$arr[$left] = $arr[$right];
	$arr[$right] = $temp;
}
# 向大佬学习来的,这样着实好看一些,不信你试试
function display($arr){
	for($i=0;$i<count($arr);$i++){
		echo $arr[$i]." ";
	}
}
# 测试代码
function test($arr){
	$arr = array(6,1,2,7,9,3,4,5,10,8);
	echo "*****未排序前*****"."\n";
	display($arr);
	echo "\n";
	bubbleSort($arr);
	echo "*****已排序后*****"."\n";
	display($arr);
}
test();
纯手撸,如有问题还请指正,谢谢!

常规套路:上个示意图(盗一个吧,嘿嘿,画的太丑)

解释一下,数据不同,流程就是这个样纸,实在画太丑…

冒泡排序示意图

结果就不写了,自己试试就知道了~

二、快速排序

开篇还是小结一下。通过一轮排序将该序列分为以基准元素为准的两个独立部分,左边,全部小于基准元素但非有序,右边,全部大于基准元素但非有序。然后就开始分别对这两部分元素进行分别快速排序,以此将整个序列变成有序序列。思想就是这样,但我还是卡壳了,哈哈。所以才来在记一遍。下面算法呈上:
function quickSort(&$arr,$left,$right){
	# 就是这个if忘写了,额,把他放头上,怪事情,唉,默哀一分钟,我的小半天时间哪
	if($left < $right){
		# 分割序列,找到分割点
		$mid = partition($arr,$left,$right);
		# 递归调用,对左边序列进行快速排序
		quick_sort($arr,$left,$mid-1);
		# 递归调用,对右边序列济宁快速排序
		quick_sort($arr,$mid+1,$mid+1);
	}
}
# 切分数组,找到分割点
function partition(&$arr,$left,$right){
	# 临时变量保存数组的第一个元素(基准元素)
	$temp = $arr[$left];
	while($left < $right){
		# 从右向左找直到有比第一个元素小的元素,并把右指针左移一位
		while($left < $right && $arr[$right] >= $temp){
			$right --;
		}
		# 将找到的这个比基准元素小的元素移动到当前最左边
		swap($arr,$left,$right);
		# 然后在从左向右找,直到找到一个元素比第一个元素大,并把左指针右移一位
		while($left < $right && $arr[$left] <= $temp){
			$left ++;
		}
		# 将找到的这个比基准元素大的元素移动到当前的最右边
		swap($arr,$left,$right);
	}
	# 最后返回这个基准元素的位置,也就是此时形成了以当前索引的元素为基准的左大右小序列
	# 此时指定是左指针和右指针是重合的,所以返回左指针或者是右指针都是可行的
	return $left;
}
# 数组中交换两个元素
function swap(&$arr,$left,$right){
	$temp = $arr[$left];
	$arr[$left] = $arr[$right];
	$arr[$right] = $temp;
}
# 展示元素
function display($arr){
	for($i=0;$i<count($arr);$i++){
		echo $arr[$i]." ";
	}
}
# 测试方法
function test(){
	$arr = array(6,1,2,7,9,3,4,5,10,8);
	echo "*****未排序前*****"."\n";
	display($arr);
	echo "\n";
	quickSort($arr);
	echo "*****已排序后*****"."\n";
	display($arr);
}
test();

同理放上示意图:
###### 还是一样的,图是盗的,数据不一样,望海涵。数据不同,原理一致!

这是快排后一轮的结果

上图是快排第一轮排序之后的结果
再来个大致的流程图(标注一下,第三轮后半部分是我自己所加,原来是水印,若有误,请指正,新手上路,勿骂,谅解,谢谢!)上图
琢磨了半天,个人感觉我想插入那张图不太对,所以自己画了张,比较丑,谅解ing。嘿嘿!重新上图:

快排流程图例



同理哈,结果就不写了,自己试试就知道了!
本次表演到此结束,感谢各位看官的观看。
欲知后事如何,且看下回分解,谢谢咯!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值