排序(选择,冒泡,二分法)、进制转换



一、选择排序

思路:
 1.首先拿数组第一个元素依次与除其自身外的其他每个元素顺序比较,如果第一个元素大于剩下的某个元素,就互换内容。
       2.经过第一轮比较之后,此时,第一个元素就是数组中最小的元素。然后再拿第二个元素与除第一个元素和其自身的元素进行比较,如果第二个元素大于剩下的某个元素,就互换内容。此时,第二个元素就是数组中倒数第二小的元素。
       3.依次类推,直到最后一个元素。

二、冒泡排序

思路:
       1.首先在第一轮排序中,数组从第一个元素到倒数第二个元素依次与其右边的元素进行比较,如果左边的元 素大于右边的元素,那么两个元素就互换。
 2.经过第一轮比较,最大的元素就已经存储到数组最右边的结点中了。
 3.第二轮排序则是从第一个元素到倒数第三个元素依次与其右边的元素进行比较,如果左边的元素大于右边 的元素,那么两个元素就互换。
        4.依照此方式,一直到只有第一和第二个元素互相比较而结束。

三、折半查找(二分查找)

思路:
 1.设置三个变量记录角标:min、max、mid。min初始值为0,max为数组最大角标,mid为(max+min)/2。
 2.查看mid角标的元素是否与待查找的值相等,如果相等,则直接返回角标值,程序终止执行。
      3.如果待查找的值小于角标为mid的元素值,那么说明待查找的元素的位置可能在min与mid角标之间。设置max=mid-1,mid=(max+min)/2,重复第1、2步的操作。
 4.如果待查找的值大于角标为mid的元素值,那么说明待查找的元素的位置可能在mid与max角标之间。设
置min=mid+1,mid=(max+min)/2,重复第1、2步的操作。
 5.如果数组中不存在待查找的元素,那么按照如上流程,最终min角标值会大于max角标值,此时返回-1。

将以上三种排序方法进行封装。
class  ArrayDemo
{
	public static void main(String[] args) 
	{
		int arr[] ={23,53,3,55,21,6,57,87,4};//定义一个int类型的数组
		int index = getIndex(arr,57);
		System.out.print("简单遍历查找:");
		System.out.println("index="+index);//打印出index
		System.out.print("排列前数组:");
		printArray(arr);//调用printArray方法
		selectSort(arr);//调用selectSort方法
		System.out.print("选择排序后数组:");
		printArray(arr);//调用printArray方法
		bubbleSort(arr);//调用bubbleSort方法
		System.out.print("冒泡排序后数组:");
		printArray(arr);//调用printArray方法
		System.out.print("二分查找:");
		int index1 = binarySearch(arr,55);
		System.out.println("index="+index1);//打印出index

			
	}
	//选择排序
	public static void selectSort(int[] arr)
	{
		for(int x=0;x<arr.length-1;x++)
		{
			for(int y =x+1;y<arr.length;y++)
			{
				if(arr[x]>arr[y])
				{
					int temp = arr[x];//两数互换
						arr[x] = arr[y];
						arr[y] = temp;
				}
			}
		}
	}
	//冒泡排序
	public static void bubbleSort(int arr[])
	{
		for(int x= 0;x<arr.length-1;x++)
		{
			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 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 binarySearch(int arr[],int key)
	{
		int min,max,mid;
		min = 0;
		max = arr.length-1;
		mid = (min+max)/2;

		while(arr[mid]!=key)
		{
			if(arr[mid]<key)
				min = mid+1;
			else if(arr[mid]>key)
				max = mid-1;
			if(max<min)
				return -1;
			mid = (min+max)/2;
		}
		return mid;

	}
	//打印数组
	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]+"]");
		}
	}
}



练习:获取一个十进制整数的2、8、16进制表现形式
          思路:
                 1.首先判断如果传入的十进制数为0,那么它的2、8、16进制都是0,直接返回0,不需要再执行余下的程序。
                 2.如下面的示意图中所示,以将十进制数转换成十六进制数为例:
 将60与15进行与操作,其值就是60的十六进制的最低位。
 再将60无符号右移4位,再与15进行与操作,其值就是60的十六进制的倒数第二位。
 3.由上面的例子可以总结出,将一个十进制数转换为十六进制的步骤就是:
 将十进制数与15相与,将结果存储到一个数组的最低位。
                           然后将十进制数右移4位,再与15进行与操作,其值就是该数对应的十六进制的倒数第二位。
 再右移4位,与15相与...直到相与结果为0为止。
 4.进而可以推理得到,10进制转换为2和8进制的规律与转换为16进制很相似,只是偏移量和相与的数字不同而已。
                           10进制转换为2进制的偏移量为1,相与数字为1。
                           10进制转换为8进制的偏移量为3,相与数字为7。

class  ArrayDemo2
{
	public static void main(String[] args) 
	{
		toHex(60);//调用toHex方法
		toBin(60);//调用toBin方法
		toOctal(60);//调用toOctal方法
	}

	//十进制转二进制
	public static void toBin(int num)
	{
			trans(num,1,1);	
	}
	//十进制转十六进制
	public static void toHex(int num)
	{
		trans(num,15,4);
	}
	//十进制转8进制
	public static void toOctal(int num)
	{
		trans(num,7,3);
	}
	
	//进制转换通用方法
	public static void trans(int num,int base,int offset)
	{
		if(num ==0)
		{
			System.out.println("0");
			return;
		}
		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;//pos为arr的数组长度
		while(num!=0){
			int temp = num & base;
				arr[--pos] = chs[temp];
				num = num>>>offset;
		
		}

		System.out.println("pos = "+pos);
		for(int x = pos;x<arr.length;x++)
		{
			System.out.print(arr[x]);
		}
		System.out.println();

	}
}


数组中的数组

二维数组[ ][ ]
         格式1:
 int[ ][ ] arr = new int [3] [2];
                 1.定义了名称为arr的二维数组。
 2.二维数组中有3个一维数组。
                 3.每一个一维数组中有2个元素。
                 4.一维数组的名称分别为arr[0],arr[1],arr[2]。
 5.给第一个一维数组第一个脚标位赋值为78写法是:arr[0][1]=78;。
 6.arr存储的是二维数组的初始地址,arr[0]、arr[1]、arr[2]存储的是一维数组的初始地址。

        格式2:
                  int[ ][ ] arr = new int [3] [ ];
                  二维数组中有3个一维数组,每个一维数组都是默认初始化值null,可以对这个三个一维数组分别进行初始化。
                  arr [0]=new int [3];
                  arr [1]=new int [1];
                  arr [2]=new int [2];

         格式3:
                  int [ ][ ] arr = {{3,8,2},{2,7},{9,0,1,6}};
 定义一个名称为arr的二维数组,二维数组中的有三个一维数组,每一个一维数组中具体元素也都已初始化。
 第一个一维数组arr[0]={3,8,2};,第二个一维数组arr[1]={2,7};,第三个一维数组arr[2]={9,0,1,6};。
                  第三个一维数组的长度表示方式:arr[2].length;。

应用:求二维数组所有元素的和。
class Array2Demo
{
	public static void main(String[] args)
	{
		int sum = 0;
		int[][] arr = {{3,1,7},{5,8,2,9},{4,1}};//定义一个二位数组
	
		for(int x = 0; x < arr.length; x++)
		{
			for(int y = 0; y< arr[x].length; y++)
			{
				sum += arr[x][y];//求和
			}
		}
		System.out.println("sum = " +sum);//打印出sum
	}
}




请提供几个符合以下范围的蓝桥杯STEMA试题 • 基本概念与结构:程序设计语言以及程序编译运行的基本概念,头文件、命名空间、主函数;• 数据类型与变量:整型(int,long long)、布尔型(bool)、字符型(char)、实型(float,double)、变量常量的定义与使用、基本数据类型转换;• 运算:赋值运算、算术运算、逻辑运算、关系运算、位运算;• 控制结构:顺序结构、分支结构、循环结构、流程图;• 数组:一维数组、二维数组及多维数组;• 字符与字符串:字符数组、字符串类、字符串常用函数及 ASCII 编码;• 指针:定义及使用;• 函数:定义使用,变量的作用域,常用的库函数;• 结构体:结构体的定义、存储,结构体数组的定义、存储、遍历等;• 类与对象:定义使用,构造函数,析构函数;• 进制及进制转换;• 初等数论:整除、因数、倍数、指数、质 ( 素 ) 数、合数等概念,判断质数、合数、约数方法,辗转相除法(欧几里得算法)求最大公约数,埃氏筛与线性筛筛质数,同余定理、加乘原理、排列组合;• 算法:o 入门算法:枚举法、模拟法;o 排序算法:冒泡排序选择排序、插入排序、计数排序;o 基础算法:贪心法、递推法、递归法、二分法;o 数值处理算法:高精度加法、高精度减法、高精度乘法、高精度除法;o 搜索算法:深度优先算法、广度优先算法;o 动态规划:一维动态规划、背包类型动态规划;o (通常仅限中高级考试)动态规划:区间类型动态规划、树型动态规划;• 数据结构:o 线性数据结构:单链表、双向链表、循环链表、栈、队列;o 树:二叉树、完全二叉树、满二叉树、哈夫曼树、二叉搜索树;o STL:vector、list、stack、queue、set、map 以及常用函数;o (通常仅限中高级考试)图:邻接矩阵、邻接表、深度优先遍历、广度优先遍历、泛洪算法。
最新发布
03-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值