java基本排序和查找

基本排序:

一、冒泡排序:

原理:依次比较相邻的两个数,将小数放在前面,大数放到后面。即首先比较第一个和第二个数,将小数放前,大数放后。然后,比较第二个数和第三个数,

            将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复以上过程,仍从第一对数开始比较(因为可能由于第二个数

            和第三个数的交换,使第一个数不再小于第二个数),将小数放前,大数放后,一直比较到最大数前的一对相邻数,将小数放前,大数放后。

            第二次冒泡结束,在倒数第二个数中得到一个新的最大数。如此下去,直至最终完成排序。由于在排序过程中总是小数往前排,大数往后排,

            相当于气泡上升,所以称为冒泡排序。

/**
 * @param Bruce 冒泡排序
 */
	public static void BubbleSort(int a[]){
		for(int i=0;i<a.length-1;i++){
			for(int j=0;j<a.length-i-1;j++){
				if(a[j]>a[j+1]){
					a[j+1]=a[j]+a[j+1];
					a[j]=a[j+1]-a[j];
					a[j+1]=a[j+1]-a[j];
			        }
		        }
		}
	}


二、插入排序:

原理:顺序的把待排序的数据元素按其值的大小插入到已排序数据元素子集合的合适位置。所以,是经过排序而得到的局部有序。

/**
 *@param Bruce 插入排序
 */
public static void insertSort(int a[]){
		int j,i,k;
		for(i=0;i<a.length;i++){
			k=a[i];
			for(j=i-1;j>=0&&a[j]>k;j--){
				a[j+1]=a[j];
			}
		  a[j+1]=k;
		}
	}


三、选择排序:

原理:每次都找到当次最大的数,按大小顺序依次放入数组相应的位置。

/**
 * @param Bruce 选择排序
 */
	public  static  void SelectSort(int[]  a){
		int temp=0;
		  int max=0;  
		  	for(int i=0;i<a.length;i++){
		  		max=i;
		  		for(int d=0;d<a.length;d++){
		  			if(a[max]<a[d]){
		  				max=d;
		  			}
		  			if(i!=max){
		  				temp=a[i];
		  				a[i]=a[max];
		  				a[max]=temp;
		  			}
		  		}
		  	} 
	
		}



四、快速排序:

原理:通过一次排序将要排序的数据分割成独立的两个部分,其中一部分的所有数据都比另一部分所有数据要小,

            然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变为有序序列。

/**
 * @param Bruce 快速排序
 */
	public static void doQuickSort(int arr[],int left,int right){
		int middle,strTemp;
		int i=left;
		int j=right;//
		middle=arr[(left+right)/2];//中间值
		do{
			while(arr[i]<middle){
				i++;
			}
			while(arr[j]>middle){
				j--;
			}
			
			if(i<=j){
				strTemp=arr[i];
				arr[i]=arr[j];
				arr[j]=strTemp;
			        i++;
				j--;
			}
			
		}while(i<j);//知道i==j,也就是说两边扫描交错的时候
		
		if(left<j){
			doQuickSort(arr,left,j);
		}
		if(right>i){
			doQuickSort(arr,i,right);
		}			
	}


扩展:

        堆排序(选择排序的升级)

        希尔排序(插入排序的升级)

        快速排序(冒泡排序的升级)

        归并排序(高级排序)





查找

顺序查找:从数据序列中的第一个元素开始,从头依次逐个查找,直到找到所要的数据或搜索完整个数据序列。适用于少量,无规则的数据。

折半查找(Binary Search):又称二分查找。要求数据序列呈现线性结构,也就是经过排序的。

public class Search {

	static int[] ary = { 99, 67, 12, 7, 30, 66, 10, 1, 98, 23, 44, 91, 26, 3, 48, 55, 77, 82, 20 };

	/* 折半查找 */
	static int binarySearch(final int[] ary, final int key) {
		int head = 0;
		int tail = ary.length - 1;
		int middle = 0;
		if (key == ary[head]) //当要查找的key位于数组头时,直接返回结果.这是二分查找最耗时的位置.
			return head;
		if (key == ary[tail]) //当要查找的key位于数组尾时,直接返回结果.这是二分查找最耗时的位置.
			return tail;
		while (head <= tail) {
			middle = (head + tail) >> 1;
			System.out.println("head:" + head + "_tail:" + tail + "_middle:" + middle);
			if (key > ary[middle]) {
				head = middle + 1;
			} else if (key < ary[middle]) {
				tail = middle - 1;
			} else {
				return middle;
			}
		}
		return -1;
	}

	public static void main(String[] args) {

		int[] t = Sort.quickSort(ary, 0, ary.length - 1);
		System.out.println(Arrays.toString(t));

		int result = binarySearch(t, 99);
		System.out.println("result:" + result);

	}

}


注:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光明矢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值