论坛首页 入门技术论坛

三种基本的数据排序方法

浏览 1927 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-03-24  
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
		}
		
	}

}
 
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics