当前位置: 首页 > article >正文

算法学习4

学习目录

  • 一.荷兰国旗
    • 1.问题一
    • 2.问题二(荷兰国旗问题)
  • 二.快排
    • 1.快排版本1
    • 1.快排版本2

一.荷兰国旗

1.问题一

一个数组,选择其中一个数作为对照,把小于等于对照数的放在数组的左边,大于对照数的放在右边;

思路:
设置小于区间,开始位置在数组开头前一位;
下标从数组第一个元素开始判断,有如下两种情况:
  (1)若当前数小于等于对照数,则将当前数与小于区间
      的下一个数进行交换,并将小于区间向前移一位,
      下标移动到下一位;
  (2)若当前数大于对照数,则直接将下标移动到下一
      位;
直到下标超出数组长度,则结束;

2.问题二(荷兰国旗问题)

一个数组,选择其中一个数作为对照,把小于等于对照数的放在数组的左边,等于对照数的将其放在数组中间,大于对照数的放在右边;

思路:
设置小于区间,开始位置在数组开头前一位;
设置大于区间,开始位置在数组结尾后一个;
下标从数组第一个元素开始判断,有如下三种情况:
  (1)若当前数小于对照数,则将当前数与小于区间
      的下一个数进行交换,并将小于区间向前移一位,
      下标移动到下一位;
  (2)若当前数等于对照数,则直接将下标移动到下一
      位;
  (3)若当前数大于对照数,则将大于区间前一位数与当
      前数进行交换,下标不变,大于区间前进一位;
直到下标与大于区间重叠,或者下标超出数组长度,则结束;

二.快排

1.快排版本1

原理:

  1. 选数组最后一个数为对照数;
  2. 对其余元素进行荷兰国旗方法排序;
  3. 将对照数放置在大于区间的前一个位置;
  4. 然后对大于和小于区间进行荷兰国旗方法排序,对照数分别为各自区间的最后一个;
  5. 然后不断重复上面2、3、4操作;



快排的时间复杂度都为O(N2);

1.快排版本2

原理:

  1. 随机选数组中的一个将其与数组的最后一个元素交换并将其当作对照数;
  2. 对其余元素进行荷兰国旗方法排序;
  3. 将对照数放置在大于区间的前一个位置;
  4. 然后对大于和小于区间进行荷兰国旗方法排序,对照数分别从各自区间中选取并将其放置在各自区间的最后一个;
  5. 然后不断重复上面2、3、4操作;



快排的时间复杂度都为O(N * logN);



代码:

public void quickSort(int[] arr,int L,int R)
{
	if(L < R){
		//选取随机数当作对照数放置在最后一位
		swap(arr,L + (int)(Math.random() * (R - L + 1)),R);
		int[] p = partition(arr,L,R);
		quickSort(arr,L,p[0] - 1);
		quickSort(arr,p[1] + 1,R);
	}	
}

//返回等于区域(左边界,右边界)
public int[] partition(int[] arr, int L,int R){
	//小于区域右边界
	int less = L - 1;
	//大于区域左边界
	int more = R;
	//L为当前数的位置
	while(L < more){
		if(arr[L] < arr[R]){
			swap(arr,++less,L++);
		}else if(arr[L] > arr[R]){
			swap(arr,--more,L);
		}else{
			L++;
		}
	}
	swap(arr,more,R);
	return new int[] {less + 1,more};
}

http://www.kler.cn/news/341991.html

相关文章:

  • 第十二章 Redis短信登录实战(基于Session)
  • 十二、血条UI
  • 第100+27步 ChatGPT学习:概率校准 Temperature Scaling
  • rabbitmq死信队列详解与使用
  • 猿人学 — 第1届第13题(解题思路附源码)
  • 普中51单片机
  • java速成指南
  • linux部署NFS和autofs自动挂载
  • pytest框架之fixture测试夹具详解
  • 【docker】要将容器中的 livox_to_pointcloud2 文件夹复制到宿主机上
  • SQL自学:什么是子查询,如何使用它们
  • 【Iceberg分析】Spark与Iceberg集成落地实践(一)
  • MyBatis 数据表与实体映射的隐藏陷阱
  • AVL树如何维持平衡
  • 性能测试知识点
  • 【JavaEE】——回显服务器的实现
  • 手撕数据结构 —— 单链表(C语言讲解)
  • 论文阅读笔记-Are Pre-trained Convolutions Better than Pre-trained Transformers?
  • SAP_FI_表ACDOCA取代的表
  • 谷歌AI大模型Gemini API快速入门及LangChain调用视频教程