三种基本的数据排序方法

package com.beyondlife.demo2;


/*
 * 这个类拥有三个静态方法用于数组排序
 * 
 */
public class NumberSort {

	public static final int ASC = 1; //升序排列
	public static final int DES = 2; //降序排列
	
	/*冒泡排序
	 * 算法设计:此算法利用前后的元素大小进行比较,交换位置;
	 * 要实现整个数组的排序需要使用外循环来控制遍历次数;
	 * 内循环来控制前后两元素的比较次数,一次内循环之后可以找出最大的或最小的放在右边.
	 * 
	 */
	public static  void bubbleSort(int list[],int type){
		
		int length = list.length;//数组的数据个数
		int flag = 1;            //标志位,判断此数组本身是否已经有序
		int temp = 0;            //中间数据,用于位置替换
		int i = 0;               //用于循环次数
		int j = 0;               //用于比较次数
		
		if(type == ASC){         //升序排序
			flag = 1;
			
			for(i = 1;i < length && flag == 1;i++){              //控制循环次数
				
				flag = 0;
				for(j = 0;j < length - i;j++){  //控制比较次数
					if(list[j] > list[j+1]){
						temp = list[j];
						list[j] = list[j + 1];
						list[j + 1] = temp;
						flag = 1;                   //修改标志位
					}//end if
				}//end inner for
			}//end outter for
			
		}else if(type == DES){     //降序排序
			
			flag = 1;
			
			for(i = 1;i < length && flag == 1;i++){              //控制循环次数
				
				for(j = i + 1;j < length - i;j++){  //控制比较次数
					if(list[j] < list[j+1]){
						temp = list[j];
						list[j] = list[j + 1];
						list[j + 1] = temp;
						flag = 1;                   //修改标志位
					}//end if
				}//end inner for
			}//end outter for
		}
	}
	
	/*选择排序
	 * 算法设计:选择排序不需要每比较两个元素就交换两其位置,
	 * 而是每次扫描一遍数据找出最大或最小的元素把其与左边排好序的元素的下一元素交换位置
	 * 
	 */
	public static void selectSort(int list[],int type){
		
		int length = list.length;        //数组的元素个数
		int pos = 0;                     //最大或最小元素的位置
		int i = 0;                       //控制循环的次数
		int j = 0;                       //用于查找元素的位置
		int temp = 0;                    //用于临时交换位置的元素
		
		if(type == ASC){//升序排序
			
			for(i = 0;i < length ;i++){
				pos = i;
				for(j = i + 1;j < length;j++){
					if(list[j] < list[pos])//查找未排序部分的最小元素
						pos = j;
				}//end inner for
				
				if(pos != i){            
					temp = list[i];
					list[i] = list[pos];
					list[pos] = temp;
				}
			}//end outer for
		}else if(type == DES){//降序排序
			
			for(i = 0;i < length ;i++){
				pos = i;
				for(j = i + 1;j < length;j++){
					if(list[j] > list[pos])//查找未排序部分的最大元素
						pos = j;
				}//end inner for
				
				if(pos != i){            
					temp = list[i];
					list[i] = list[pos];
					list[pos] = temp;
				}
			}//end outer for
		}
		
	}
	
	/*插入排序
	 *算法设计:此算法也是局部有序的,这里假设左边有序,
	 *那么现在需要把有序的下一个元素插入到有序的一端,
	 *这样需要移动有序的一端使空出合适的位置给插入原素
	 */
	public static void insertSort(int list[],int type){
		
		int length = list.length;        //数组的元素个数
		int i = 0;                       //控制循环的次数
		int j = 0;                       //用于定位元素
		int temp = 0;                    //用于临时交换位置的元素
		if(type == ASC){//升序排序
			
			for(i = 1;i < length;i++){             //控制循环次数
				j = i;
				temp = list[i];
				while(j > 0 && list[j - 1] > temp){//找到插入的位置
					list[j] = list[j-1];           //比插入元素大的元素须向后移动
					j--;
				}
				list[j] = temp;                    //插入元素
			}//end for
		}else if(type == DES){
			
			for(i = 1;i < length;i++){             //控制循环次数
				j = i;
				temp = list[i];
				while(j > 0 && list[j - 1] < temp){//找到插入的位置
					list[j] = list[j-1];           //比插入元素小的元素须向后移动
					j--;
				}
				list[j] = temp;                    //插入元素
			}//end for
		}
		
	}

}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值