java各种算法

public static int[] getResult(int[] b)
	{
		int len = b.length;
		for(int i=0;i<len-1;i++)
		{
			for(int j=0;j<len-i-1;j++)  
			{
				
				if(b[j]>b[j+1])
				{
					int a=b[j];
					b[j] =b[j+1];
					b[j+1] = a;
				}
				
			}
		}
		return b;
	}

冒泡排序

//

1,首先最外层循环决定需要进行几轮比较,比如长度为n的数组,至少需要进行n-1轮比较。

2,里面的循环则是数组中的每一个数与后面的一个数进行比较,如果大小不等,则替换位置,里面每循环一次比较出当前多个数字中的最大值,并排在队末并且下一次循环所比较的次数会减少,因为决定了大小的数字不需要再次进行比较。

/**
	 * 找出数组中的 最小值
	 */
	public static int getMin(int[] a)
	{
		int min = a[0];//假设最小值为数组中的第一个元素。
		for(int i=0;i<a.length;i++)
		{
			if(min>a[i])//如果最小值大于数组中的某一个数,则将该数赋值给最小值。
			{
				min = a[i];
			}
		}
		return min;
	}

快速排序:

/**
	 *
	 * 快速排序
	 * @param a 传入要排序的集合或者数组
	 * @param left 用于排序的左边指针
	 * @param right 用于排序的右边指针
	 */
	public static void  speedSort(int left,int right,int[] a)
	{
		if(left>right) return;//当坐标指针大于右边指针时,结束递归调用(此时排序的数仅有一个,就可以直接退出了。)
		int temp = a[left];//设置一个基准值,通常为集合第一个元素。
		int length = a.length;
		int _left = left;//设置一个临时变量,我们可以叫它为左指针,从左到右扫描
		int _right = right;//同理右指针,从右往左扫描
		if(length>=2)//当数组长度大于等于2,排序才有意义。
		{

			while(_left!=_right)//当坐标指针与右边指针不等时,即指向的不是同一个位置。
			{
				//System.out.println("cccc");
				while(_right>_left&&a[_right]>=temp)//当右指针位置 指向的数字小于基准数时,则退出循环,否则一直向左移动。
				{
					_right--;//

				}
				while(_left<_right&&a[_left]<=temp)//当左指针位置 指向的数字大于基准数时,则退出循环,否则一直向右移动。
				{
					_left++;
					

				}
				
				
				if(_left<_right)//左指针指向的数大于基准数,而右边指针的指向的数小于基准数,此时替换相应元素的位置
				{
					int c = a[_left];
					a[_left]=a[_right];
					a[_right] = c;
				}
				
			}
			//再将基准数与此时指针指向的数替换位置,则,在基准数左边的为小于它的,右边为大于它的。
			int d = a[_left];
			a[_left] = a[left];
			a[left] = d;
			//基准数左边与右边的数顺序还未定,需要递归调用此方法。
			speedSort(left,_left-1,a);//排序剩余左边数
			speedSort(_right+1,right,a);//排序剩余右边数

		}
	}

选择排序:

思路:在一堆数中找出最小的数,放到第一个数的位置,然后再从剩下的数字中找出最小的数放到第二个,以此类推,最终可排序。

/**
	 * 选择排序
	 */
	public static void selectSort(int[] a,int j){//方法一,j的初始值传0
		if(j==a.length) return;
		int min = Integer.MAX_VALUE;
		int k=-1;
		for(int i=j;i<a.length;i++)
		{
			if(min>a[i])
			{
				min = a[i];
				k =i;
			}
			
		}
	    int c = a[k];
	    a[k] = a[j];
	    a[j] = c;
	    selectSort(a,j+1);
	}
	public static void selectSort1(int[] a){//方法二
		int k=-1;//最小数对应的序号
		for(int n=0;n<a.length;n++)
		{
			int min = Integer.MAX_VALUE;//每次循环都将最小值重新赋值为Interger所能表示的最大值,已保证每次循环第一次比较能被替换
			
			for(int i=n;i<a.length;i++)
			{
				if(min>a[i])
				{
					min = a[i];
					k =i;
				}
				
			}
		    int c = a[k];//找到剩余数中的最小值,与第n个数进行替换。
		    a[k] = a[n];
		    a[n] = c;
		}
		
	}


下面为比较详细的图解。来自其他博友。

点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值