黑马程序员------数组(排序、查询、进制转换)

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ---------------------- 

 

微笑排序

选择排序每一趟从待排序的数组元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。示意图如下:

 

 

 

选择排序的实现:

public class ArrayDemo
{
	/*
	选择排序
	内循环一次,重复出现头下标的位置上。
	*/
	//打印数组的功能
	public static void printArray(int[] arr){
		System.out.print("[");
		for(int x=0 ;x<arr.length ;x++){
			if(x!=arr.length-1)
				System.out.print(arr[x]+",");
			else
				System.out.println(arr[x]+"]");
		}
	}
	//数组由小到大的排序功能
	public static void selectSort(int[] arr){
		for(int x = 0; x<arr.length;x++){
			for (int y = x+1;y<arr.length;y++){
				if(arr[x]>arr[y]){
					//当后面的小于时(arr[x]>arr[y]),值互换
					int temp = arr[x];
					arr[x] = arr[y];
					arr[y] = temp;
				}
			}
		}
	}
	public static void main(String[] args){
		int[] arr = {3,1,4,2,7,5};
		//排序前
		printArray(arr);
		//排序
		selectSort(arr);
		//排序后
		printArray(arr);
	}
}


 

冒泡排序的实现:

冒泡排序算法的运作原理如下:
  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

/*
	冒泡排序
	*/
	public static void bubbleSort(int[] arr){
		for(int x = 0; x<arr.length-1;x++){
			//-x:让每一次比较的元素减少;-1,避免数组下标越界。
			for(int y = 0; y<arr.length-x-1;y++){
				if(arr[y]>arr[y+1]){
					int temp = arr[y];
					arr[y] = arr[y+1];
					arr[y+1] = temp;
				}
			}
		}
	}

为便于观察,从上面提取选择排序

/*
	选择排序
	内循环一次,重复出现头下标的位置上。
	*/
	//打印数组的功能
	public static void printArray(int[] arr){
		System.out.print("[");
		for(int x=0 ;x<arr.length ;x++){
			if(x!=arr.length-1)
				System.out.print(arr[x]+",");
			else
				System.out.println(arr[x]+"]");
		}
	}



 根据上面各程序发现,无论什么排序,都需要满足条件的元素进行位置置换。所以,可以把这部分相同的代码提取出来,单独封装成一个函数。

public static void swap(int[],int a,int b){
		int temp = arr[a];
		arr[a] = arr[b];
		arr[b] = temp;
	}

 

微笑查找

查找与折半查找:二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

    首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

算法要求:

  1. 必须采用顺序存储结构
  2. 必须按关键字大小有序排列。
public class ArrayDemo
{
	//定义功能,获取key第一次出现在数组中的位置,如果是-1,那么代表该key在数组中不存在。
	public static int getIndex(int[] arr,int key){
		for(int x = 0; x<arr.length;x++){
			if(arr[x]==key){
				return x;
			}
		}
		return -1;
	}

	//折半查找,提高效率,但是要保证是有效的数组。
	public static int halfSearch(int[] arr, int key){
		int min ,max ,mid;
		min = 0;
		max = arr.length-1;
		mid = (min+max)/2;
		while(arr[mid]!=key){
			if(key>arr[mid])
				min = mid + 1;
			else if(key<arr[mid])
				max = mid -1;
			if(min>max)
				return -1;
				mid = (min+max)/2;
		}
		return mid;
	}
	//折半的第二种方式。
	public static int halfSearch_2(int[] arr, int key){
		int min ,max ,mid;
		min = 0;
		max = arr.length-1;
		while(min<=max){
			mid = (min+max)/2;
			if(key>arr[mid])
				min = mid+1;
			else if (key<arr[mid])
				max = min-1;
			else
				return mid;
		}
		return -1;
	}

	//练习,有一个有序的数组,想要将一个元素插入该数组中,放在哪个位置,
	//还能保证这个数组有序。既,如何获取该元素在数组中的位置。
	public static int getIndex_2(int[] arr,int key){
		//折半的延伸....思考
		int min ,max ,mid;
		min = 0;
		max = arr.length-1;
		while(min<=max){
			mid = (min+max)/2;
			if(key>arr[mid])
				min = mid+1;
			else if (key<arr[mid])
				max = min-1;
			else
				return mid;
		}
		return min;        //折半查找的时候这里返回-1
	}

	public static void main(String[] args){
		int[] arr = {1,3,4,7,14,52};
		int index = getIndex_2(arr,45);
		//int index = halfSearch_2(arr,14);
		System.out.println("index:"+index);
	}
}


可怜 以上知识要多看多思考

微笑进制转换

十进制转二进制

class ArrayDemo
{
	public static void main(String[] args){
		toBin(13);
	}
	//十进制转二进制
	public static void toBin(int num){
		StringBuffer sb = new StringBuffer();
		while(num>0){
			sb.append(num%2);
			num = num/2;
		}
		System.out.println(sb.reverse());//sb.reverse()字符串逆转。
	}
}

十进制转十六进制
 

 算法:1.与15进行&运算。2.得到的数和10比较,小于10的记录数字,大于10的要记录字母。3.右移4位。

class ArrayDemo
{
	public static void main(String[] args){
		toHex(33);
	}
	//十进制转十六进制
	public static void toHex(int num){
		StringBuffer sb = new StringBuffer();
		for(int x=0; x<8;x++){
			//和15&运算
			int temp = num &15;
			//判断是否要输出数字或字母
			if(temp>9)
				sb.append((char)(temp-10+'A'));
			else
				sb.append(temp);
			//操作后向右移动4位
			num = num>>>4;
			}
		System.out.println(sb.reverse());
		}
}


查表法进制转换。

0  1  2  3  4  5  6  7  8  9   A  B  C  D  十六进制中的元素

 0      1     2     3      4      5      6      7     8      9        10    11    12   13     数组下标

查表法:

1.将所有的元素临时存储起来,建立对应关系。

2.每一次&15后的值作为索引去查建立好的表。就可以找到对应的元素。

class ArrayDemo
{
	//抽取出数据进制转换功能函数
	public static void trans(int num, int base, int offset){
		if(num == 0){
			System.out.println(0);
			return;
		}
		//数组中的元素为16进制的字符表示,而下标正好是0-15.与16进制相对应
		char[] chs = {'0','1','2','3'
					,'4','5','6','7'
					,'8','9','A','B'
					,'C','D','E','F'};
		//定义一个临时容器
		char[] arr = new char[32];
		int pos = arr.length;
		while(num!=0){
			int temp = num & base;
			arr[--pos] = chs[temp];
			num = num >>> offset;
		}
		//存储数据的arr数组遍历
		for(int x = pos;x<arr.length;x++){
			System.out.print(arr[x]);
		}
		System.out.println();
	}
	//10转换成2进制
	public static void toBin(int num){
		trans(num,1,1);
	}
	//10转换成8进制
	public static void toOctal(int num){
		trans(num,7,3);
	}
	//10转换成16进制
	public static void toHex(int num){
		trans(num,15,4);
	}
	public static void main(String[] args){
		toBin(13);
		toOctal(23);
		toHex(-84);
		toHex(0);
	}
}

 

 

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ---------------------- 

详情请查看:http://edu.csdn.net

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值