一,打印三角形(for循环嵌套)
1.用*打印直角三角形
需求:打印如下直角三角形
***** **** *** ** *
思路:
- 采用for嵌套循环
- 外层控制行数
- 内层控制列数(列数为变量,每次均减1)
代码实现:
class ForForDemo {
public static void main(String[] args) {
System.out.println("--------------------------");
System.out.println("第一种方法,定义列数变量z1");
int z1 =5;
for (int x=0;x<5;x++ ){
for (int y=0;y<z1 ;y++ ){
System.out.print("*");
}
System.out.println("");
z1--;
}
System.out.println("--------------------------");
System.out.println("第二种方法,定义列数变量z2");
int z2 =0;
for (int x=0;x<5 ;x++ ){
for (int y=z2;y<5 ;y++ ){
System.out.print("*");
}
System.out.println("");
z2++;
}
System.out.println("----------------------------------");
System.out.println("第三种方法,列变量用行的变量来代替");
for (int x =0;x<5 ;x++ ){
for (int y=x;y<5 ;y++ ) /*或者for (int y=0;y<5-x;y++)*/{
System.out.print("*");
}
System.out.println("");
}
System.out.println("------------------------");
System.out.println("打印与之相反的直角三角形");
for (int x=0;x<5 ;x++ ){
for (int y=0;y<=x ;y++ ){
System.out.print("*");
}
System.out.println("");
}
}
}
- 运行结果:
2.正三角形
需求:打印如下正三角形(倒三角形和正三角形)
* * * * * * * * * * * * * * * --------- * * * * * * * * * * * * * * *
思路:
- 外循环控制行数
- 内循环首位每一层比上层多一空格,列数减1
代码实现:
class TriangleDemo {
public static void main(String[] args) {
for (int x=0;x<5 ;x++ ){
//用于打印每行变化的空格数
for (int n=0;n<x;n++){
System.out.print(" ");
}
for (int y=0;y<5-x ;y++ ){
System.out.print("* ");
}
//用于换行
System.out.println("");
}
System.out.println("---------");
//以下用于打印与上面相反的正三角形
for (int x=0;x<5 ;x++ ){
for (int n=x;n<4 ;n++ ){
System.out.print(" ");
}
for (int y=0;y<=x ;y++ ){
System.out.print("* ");
}
System.out.println("");
}
}
}
- 运行结果
二,排序(for循环嵌套if语句)和二分法查找(while循环嵌套if语句)
1,选择排序
思路:
- 1、首先:将数组第一个元素依次与除其自身外的其他每个元素顺序比较,如果第一个元素大于剩下的某个元素,就互换内容。经过第一轮比较之后,此时,第一个元素就是数组中最小的元素。
- 2、然后:再拿第二个元素与除第一个元素和其自身的元素进行比较,如果第二个元素大于剩下的某个元素,就互换内容。此时,第二个元素就是数组中倒数第二小的元素。
- 3、最后:依次类推,直到最后一个元素。
代码示例:
/*
需求:对数组arr[6]={2,6,4,1,8,9}进行选择排序
*/
class SelectDemo {
//定义数组打印函数:1.结果无具体值;2.参数为数组
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[]arr,int a,int b) {
int temp;
temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
//定义选择排序函数:1.结果无具体值,返回类型为void;2.参数为数组
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]) //如果外循环的数大于内循环的数,则交换位置
swap(arr,x);
}
}
//主函数入口
public static void main(String[] args) {
int []arr =new int []{2,6,4,1,8,9};
System.out.println("排序前:");
printArray(arr);
selectSort(arr);
System.out.println("排序后:");
printArray(arr);
}
}
- 运行结果:
2,冒泡排序
思路:
- 1、首先在第一轮排序中,数组从第一个元素到倒数第二个元素依次与其右边的元素进行比较,如果左边的元素大于右边的元素,那么两个元素就互换。经过第一轮比较,最大的元素就已经存储到数组最右边的结点中了。
- 2、然后第二轮排序则是从第一个元素到倒数第三个元素依次与其右边的元素进行比较,如果左边的元素大于右边的元素,那么两个元素就互换。
- 3、最后依照此方式,一直到只有第一和第二个元素互相比较而结束。
代码示例:
public static void bubbleSort(int[]arr) {
for (int x=0;x<arr.length-1;x++){ //外循环控制每次相邻比较的次数
for(int y=0;y<arr.length-1-x;y++){ ////内循环将相邻的两个数进行比较,每次从第一个数开始并依次减少一次
if(arr[y]> arr[y+1])
swap(arr,y,y+1);
}
}
}
注:实际开发中直接调用Arrays类中的sort()方法(导入util下的Arrays包)即可!
3,二分法查找(while循环嵌套if语句)
前提:数组有序。
- 思路:
- 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角标值(此处为while循环的结束条件),此时返回-1。
- 1、定义三个变量记录角标:min、max、mid。min初始值为0,max为数组最大角标,mid为
- 代码实现:
public static int binarySearch(int[]arr,int key){ //传入key=9的实现过程
int min=0;
int max =arr.length-1; //5
int mid =(min+max)/2; //2
while(min<=max){ //0<5 3<5 4<5 5=5
if (arr[mid]<key){ //4<9 8<9 8<9
min = mid+1; //3 4 5
mid = (min+max)/2; //4 4 5
}
else if(arr[mid]>key){
max = mid -1;
mid = (min+max)/2;
}
else
return mid; // 5
}
return -1;
}
//注:可以将while前的int mid =(min+max)/2;放入while循环的首行中,可以省略if和if elae中的mid = (min+max)/2;语句达到简化代码的效果。
- 练习:
- 需求:向数组{13,15,19,28,33,45,78,106}中插入值为44的元素,求出插入的角标和插入后的新数组
- 思路:采用二分法查找,若数组中有该数,直接返回mid,没有该数返回min。
- 代码示例:
class SearchDemo {
public static int searchDemo(int []arr,int key){
int min=0,max=arr.length-1,mid;
while (min<=max) {
mid=(min+max)/2;
if (arr[mid]<key)
min=mid+1;
else if (arr[mid]>key)
max=mid-1;
else return mid;
}
return min;
}
public static void main(String[] args) {
int []arr=new int[]{13,15,19,28,33,45,78,106};
int []arr_2=new int[9];
System.out.println("原数组:");
printArray(arr);
int index =searchDemo(arr,44);
System.out.println("插入的数为44;index="+index);
//求新数组
for (int x=0;x<index ;x++ )
arr_2[x]=arr[x];
arr_2[index]=44;
for (int x=index+1;x<9 ;x++ )
arr_2[x]=arr[x-1];
System.out.println("新数组:");
printArray(arr_2);
}
//定义数组打印函数
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]+"]");
}
}
}
- 运行结果:
注:实际开发中直接调用Arrays类中的binarySearch()方法(导入util下的Arrays包)即可!