编程语言
首页 > 编程语言> > 算法设计与分析——简单的排序算法(冒泡排序,选择排序,插入排序)

算法设计与分析——简单的排序算法(冒泡排序,选择排序,插入排序)

作者:互联网

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)

标签:Comparable,name,int,冒泡排序,算法,Student,排序,public
来源: https://blog.csdn.net/shuux666/article/details/123581719