5.3排序算法和程序调试

一.冒泡排序

  通过对待排序序列从后往前(从下标较大的元素开始)依次比较相邻元素的排序码,

若发现逆序则交换,使排序码较小的元素逐渐从后部移向前部,就像水底下气泡一样往上冒。

二.选择排序

  是从欲排序的数据中,按指定的规则选出某一元素,经过和其他元素重整,再依原则交换位置后达到排序的目的。

三.插入排序

  把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无素表包含n-1个元素,

排序过程中每次从无序表中取出第一个元素与有序表中的元素比较,并把它插入到有序表中的适当位置,成为新的有序表。

四.快速排序

  是对冒泡排序的一种改进。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,

然后再按此方法对它的两部分数据分别快速排序,整个过程递归进行。

五.程序调试步骤:
1.在需要查看的代码左边设置断点,左键双击蓝色区域,再次双击就是取消断点
2.右键运行程序选择--debug as
3.进入到调试开发模式,左上区域是程序的控制面板,右上区域是变量的观察窗口,中间是代码执行位置
4.在左上区域点击step over图标可以将代码逐步执行,并且同时观察变量的取值情况,找到代码的原因
5.最后不要忘记将代码的执行停止下来,在右上角切换开发模式继续开发

六.例子

package com.demo1031;

public class Demo {
	public static void main(String[] args) {
		int nums[] = {12,43,76,33,9,100,33,4,1,56,88,96};
		//冒泡排序
//		for (int i = 0; i < nums.length-1; i++) {//轮次
//			for(int j=0;j<nums.length-1-i;j++){//两两相邻的比较,并且判断是否交换位置
//				if(nums[j]<nums[j+1]){
//					int num = nums[j];
//					nums[j] = nums[j+1];
//					nums[j+1] = num;
//				}
//			}
//		}
//		
		
		
		//选择排序 每次选出数组中最小的数和第一位交换
//		for (int i = 0; i < nums.length-1; i++) {
//			//找到当前的最小值
//			int min = nums[i];//设定最小值擂台
//			for (int j = i; j < nums.length; j++) {
//				if(nums[j]<min){
//					min = nums[j];
//				}
//			}
//			//找到最小值的位置
//			int index = 0;//记录下当前找到的最小值的位置
//			for (int j = 0; j < nums.length; j++) {
//				if(nums[j]==min){
//					index = j;
//				}
//			}
//			//将最小值位置上的数字和当前数组的第一位交换
//			int temp = 0;
//			temp = nums[i];
//			nums[i] = nums[index];
//			nums[index] = temp;
//		}
		
		
		//插入排序法
		for (int i = 1; i < nums.length; i++) {
			//找到nums[i]要插入到前面数组的位置
			int index = -1;//用来记录位置的变量
			for(int j=0;j<i;j++){
				if(nums[i]<nums[j]){
					index = j;
					break;//找到位置立即跳出循环停止查找
				}
			}
			
			if(index==-1){//如果位置没有发生变化则意味着当前数字应该排在该数组的最后一位,下面的操作跳过
				continue;
			}
			//完成插入算法
			int temp = nums[i];//将要插入的数字记录下来,因为待会插入算法会覆盖掉当前数字
			//把要插入的位置后面的数字全部往后移动一位,留出插入的位置
			for(int k=i-1;k>=index;k--){
				if(k<nums.length-1){
					nums[k+1] = nums[k];
				}
			}
			//完成插入
			nums[index] = temp;
		}
		
		//输出数组元素
		for (int i = 0; i < nums.length; i++) {
			System.out.print(nums[i]+" ");
		}
	}
}

  

/**
 * 冒泡排序法
 */
package com.class1031;

public class Class01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		int arr[]={12,45,33,21,1,99,88,100,66};
		for(int i=0;i<arr.length-1;i++)
		{
			for(int j=0;j<arr.length-i-1;j++)
			{
				//每次找出最小值放到最后面
				if(arr[j]<arr[j+1])
				{
					int min=arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=min;
					
				}
			}
		}
		for(int i=0;i<arr.length;i++)
		{
			System.out.print(arr[i]+" ");
		}
	}

}

  

/*
 * 选择排序法
 */
package com.class1031;

public class Class02 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		int arr[]={14,56,78,89,1,43,44};
		for(int i=0;i<arr.length-1;i++){
			int min=arr[i];
			int index=i;
			for(int j=i;j<arr.length;j++){
				if(min>arr[j])
				{
					min=arr[j];
					index=j;
				}
			}
			int temp=arr[i];
			arr[i]=arr[index];
			arr[index]=temp;
	
		}
		
		for(int i=0;i<arr.length-1;i++){
			System.out.print(arr[i]+" ");
		}
	}

}

  

package com.class1031;

public class Class03 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		int a[]={11,3,5,79,14,66,44,11};
		for(int i=1;i<a.length;i++){
			int max=a[i];
			int index=-1;
			for(int j=1;j<=i;j++){
				if(max<a[j-1])
				{
					index=j-1;
					break;
				}
			}
			if(index==-1)
			{
				continue;
			}
			int temp=a[i];
			
			for(int j=i-1;j>=index;j--)
			{
				if(a.length-1>j)
				{
				    a[j+1]=a[j];
				}
			}
			a[index]=temp;
		}
		for(int i=0;i<a.length;i++)
		{
			System.out.print(a[i]+" ");
		}
	}

}

  

 

posted @ 2019-02-05 22:18  五柳先生柳三变  阅读(341)  评论(0编辑  收藏  举报