IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 算法设计与分析——简单的排序算法(冒泡排序,选择排序,插入排序) -> 正文阅读

[数据结构与算法]算法设计与分析——简单的排序算法(冒泡排序,选择排序,插入排序)

Comparable接口

在实际应用中,我们对一些数据进行排序,通常不会是某个单独的数字,比如根据学生的年龄对学生排序、根据商品的价格对商品进行排序等等,这时我们排序操作的就是一个对象,Java提供了一个接口Comparable就是用来定义排序规则的。

实例:定义一个学生类Student,具有姓名name和年龄age两个属性,通过Comparable接口提供比较规则。

package learn;

class Student implements Comparable<Student>{
	public String name;
	public int age;
	
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}

	@Override
	public int compareTo(Student o) {
		// TODO Auto-generated method stub
		return this.getAge()-o.getAge();
	}

	
}
public class ComparableApp {
	public static void main(String args[]) {
		Student s1=new Student();
		Student s2=new Student();
		s1.setName("111");
		s1.setAge(20);
		s2.setName("222");
		s2.setAge(19);
		System.out.print(compare(s1,s2));
	}
	public static Comparable compare(Comparable c1,Comparable c2) {
		Comparable c=new Student();
		int result=c1.compareTo(c2);
		//如果result<0,c2>c1
		//如果result>0,c2<c1
		if(result<0) {
			c=c2;
		}
		else if(result>=0) {
			c=c1;
		}
		return c;
	}
}

1.冒泡排序

(1)比较相邻的元素,如果第一个元素比后一个元素大,就交换这两个元素的位置

(2)对每一对相邻元素做同样的工作,最终最后位置的元素就是最大值

总结:第一次冒泡,最大值放在最后一位

???????????第二次冒泡,第二大值放在倒数第二位

? ? ? ? ? ?依次下去

? ? ? ? ? ?每冒泡一次元素就会少一个

public class maopapapp {
	public static void main(String args[]) {
		int [] test= {6,5,4,3,2,1};
		System.out.print("初始状态:");
		for(int k=0;k<test.length;k++) {
			System.out.print(test[k]+" ");
		}
		System.out.println();
		for(int i=0;i<test.length;i++) {
			for(int j=0;j<test.length-i-1;j++) {
				if(test[j]>test[j+1]) {
					int temp=test[j];
					test[j]=test[j+1];
					test[j+1]=temp;
				}
			}
			System.out.print("第"+(i+1)+"次冒泡:");
			for(int k=0;k<test.length;k++) {
				System.out.print(test[k]+" ");
			}
			System.out.println();
		}
	}
}

时间复杂度:O(N^2)

最坏情况下,要排序的元素逆序

元素比较的次数为:(N-1)+(N-2)+(N-3)+...+2+1=N*(N-1)/2

元素交换的次数为:(N-1)+(N-2)+(N-3)+...+2+1=N*(N-1)/2

总执行次数:N*(N-1)/2+N*(N-1)/2=N^2-N

2.选择排序

(1)每一次遍历找出最小值所在的位置

(2)将最小值放在第一个位置,以此类推

public class xuanzeapp {
	public static void main(String args[]) {
		int[] test= {6,5,4,3,2,1};
		
		System.out.print("初始数组为:");
		for(int k=0;k<test.length;k++) {
			System.out.print(test[k]+" ");
		}
		System.out.println();
		
		for(int i=0;i<test.length-1;i++) {
			int minindex=i;
			for(int j=i+1;j<test.length;j++) {
				if(test[j]<test[minindex]) {
					minindex=j;
				}
			}
			
			int temp=test[minindex];
			test[minindex]=test[i];
			test[i]=temp;
			
			System.out.print("第"+(i+1)+"次选择排序结果:");
			for(int k=0;k<test.length;k++) {
				System.out.print(test[k]+" ");
			}
			System.out.println();
		}
	}
}

时间复杂度:O(N^2)

最坏情况下,要排序的元素逆序

数据比较次数:(N-1)+(N-2)+(N-3)+...+2+1=N*(N-1)/2

数据交换次数:N-1

总执行次数:N*(N-1)/2+N-1

3.插入排序

(1)假设第一个数有序,第二个数与前面一个数比较,若比第一个数小,则将第二个数与第一个数交换位置

(2)第一步后前面两个数已经有序,第三个数与第二个数比较,若比第二个数小,则将第二个数与第一个数交换位置,再与前一个数比较

(3)依次类推

public class charuapp {
	public static void main(String args[]) {
		int [] test= {9,8,7,6,5,4,3,2,1};
		System.out.print("初始状态:");
		for(int k=0;k<test.length;k++) {
			System.out.print(test[k]+" ");
		}
		System.out.println();
		for(int i=1;i<test.length;i++) {
			for(int j=i;j>0;j--) {
				if(test[j]<test[j-1]) {
					int temp=test[j];
					test[j]=test[j-1];
					test[j-1]=temp;
				}
			}
			System.out.print("第"+i+"次插入排序:");
			for(int k=0;k<test.length;k++) {
				System.out.print(test[k]+" ");
			}
			System.out.println();
		}
	}
}

时间复杂度:O(N^2)

最坏情况下,要排序的元素逆序

数据比较次数:(N-1)+(N-2)+(N-3)+...+2+1=N*(N-1)/2

数据交换次数:(N-1)+(N-2)+(N-3)+...+2+1=N*(N-1)/2

总执行次数:N*(N-1)

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-11 22:26:29  更:2022-03-11 22:30:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:41:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码