1.选择排序(直接排序) : 使用数组中的一个元素与其他位置的元素挨个比较一次,符合条件交换位置。
需求: 定义一个函数接收一个数组对象,然后把数组中最大值放在第一位。 其他元素不能丢失,顺序无所谓。
例子1:
class De{
public static void main(String[] args)
{
int[] arr = {13,11,17,4,19};
selectSort(arr); 调用
}
public static void selectSort(int[] arr)
{
for(int j = 0 ; j<arr.length-1 ; j++ ){
for(int i = j+1 ; i<arr.length ; i++){
if(arr[j]<arr[i]){
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
//遍历数组的元素,查看效果
for(int i = 0 ; i<arr.length ; i++){
System.out.print(arr[i]+",");
}
}
}
2.冒泡排序: 相邻的两个元素比较一次,符合条件交换 位置。
数组中的两个相邻元素:arr[i], arr[i+1]
需求: 把最大值放在倒数第一个位置。
例子2:
class Demo3
{
public static void main(String[] args)
{
int[] arr = {11, 14 , 5 , 18, 3};
bubbleSort(arr);
}
public static void bubbleSort(int[] arr){ 相邻的两个数相比,只能用到最大所引值的前面一个
for(int j = 0 ; j<arr.length-1; j++){ // 疑问:arr.length-1。 因为五个数据只需要找出四个最大值即可排序
//把最大值放在倒数的第一个位置
for(int i = 0 ; i < arr.length-1 - j ; i++){ //i=4 疑问: 因为for循环每执行完一次就 可以找出一个最大值,每找出一个最大值其实就可以少比较一次。
if(arr[i]>arr[i+1]){
//交换位置
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
}
//遍历数组,查看效果
for(int i = 0; i < arr.length ; i ++){
System.out.print(arr[i]+",");
}
}
}
3.二分法(折半查找法): 折半查找法只适用于有序的数组。
折半法:有一个范围,去找这个范围中间的值
最开始位置:min ;最后位置:max ; 中间位置:mid .
需求: 定义一个函数接收一个数组与一个要查找的元素,然后返回元素在数组中的索引值。如果不存在
返回-1表示。
例子3:
class De
{
方法一:
public static void main(String[] args)
{
int[] arr = {12,15,18,19,34};
int index = halfSearch(arr,13);
System.out.println("索引值:"+ index);
}
//折半查找法
public static int halfSearch(int[] arr, int target)
{
//定义三个变量记录查找范围的最大、最小、中间索引值
int max = arr.length-1;
int min = 0;
int mid = (max+min)/2;
while(true){
if(target>arr[mid]){
min = mid+1;
}else if(target<arr[mid]){
max = mid-1;
}else{
//找到的情况
return mid;
}
//由于上面会改变最大、最小索引值,所以应该要重新计算中间值。
mid = (max+min)/2;
//找不到的情况
if(min>max){
return -1;
}
}
}
方法二:
//遍历查找法:遍历数组中的每个元素与目标元素比较一次。
public static int searchEle(int[] arr,int target){
for(int i = 0 ; i<arr.length ; i++){
if(arr[i]==target){
return i;
}
}
return -1;
}
}
例子4:
需求: 把一个数组的元素翻转. 元素位置的交换
class Demo5
{
public static void main(String[] args)
{
// 值传递..
char[] arr = {'传','智','播','客'}; //0x97
reverse(arr);
遍历查看结果
for(int i = 0; i < arr.length ; i++){
System.out.print(arr[i]+",");
}
}
public static void reverse(char[] arr){ // 0x97
for(int startIndex=0 ,endIndex=arr.length-1 ; startIndex<endIndex; startIndex++,endIndex--){
//交换位置
char temp = arr[startIndex];
arr[startIndex] = arr[endIndex];
arr[endIndex] = temp;
}
}
}
4.
二维数组:数组的数组。
1).二维数组的定义格式:
数据类型[][] 变量名 = new 数据类型[长度1][长度2];
l练习1.
1. 现在有如下的一个数组:int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} ,
要求清除数组中为0的元素,然后存储非零的数据存储到一个新数组中。而且要求新的数组不能浪费长度。
分析:1.查找数组中0的元素
2.清除0
3.创建新数组录入旧数组非0的元素
import java.util.*;
class De
{
public static void main(String[] args)
{
int oldArr[]={0,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
int[] newArr = clearZero(oldArr);
System.out.println("新数组的元素:"+ Arrays.toString(newArr));
}
public static int[] clearZero(int[] oldArr){
//先统计0的个数
int count = 0; //定义该变量用于记录0的个数
for(int i = 0 ; i<oldArr.length ; i++){
if(oldArr[i]==0){
count++;
}
}
//创建新的数组
int[] newArr = new int[oldArr.length-count];
int index = 0; //新数组使用的索引值。
//遍历旧的数组,把非0的数据存储到新数组中。
for(int i = 0 ; i<oldArr.length ; i++){
if(oldArr[i]!=0){ //如果是非0的数据,就应该存储到新的数组中.
newArr[index++] = oldArr[i];
}
}
return newArr;
}
}
练习2.
2. 清除重复元素。 int[] oldArr = {1,4,9,4,1,1,7}; 把非重复元素存储到一个新的数组中返回,而且也是不能浪费长度。
分析:1.查找重复元素
2.清除重复的元素
3.创建新数组录入非重复元素
import java.util.*;
class Demo9
{
public static void main(String[] args)
{
int[] oldArr = {1,4,9,4,1,1,7};
int[] newArr = clearRepeat(oldArr);
System.out.println("清除重复元素的数组:"+ Arrays.toString(newArr));
}
public static int[] clearRepeat(int[] oldArr){
int count = 0 ; //count变量 是用于记录重复元素的个数
//计算出重复元素的个数
for(int i = 0 ; i<oldArr.length -1 ; i++ ){
for(int j = i+1 ; j<oldArr.length ; j++){
if(oldArr[i]==oldArr[j]){
count++;
break;
}
}
}
//创建一个新的数组
int[] newArr = new int[oldArr.length-count];
int index = 0; //新数组使用的索引值。
//遍历旧数组
for(int i = 0 ; i<oldArr.length ; i++){
boolean flag = false; //该标识是用于标识取出的元素是否存在新数组中。 false默认情况是不存在 的。
int temp = oldArr[i]; //从旧数组 中取出遍历的元素
//遍历新的数组是否存在该数据
for(int j = 0 ; j<newArr.length ; j++){
if(newArr[j]==temp){
flag = true;
break;
}
}
//该元素不存在新数组中,这时候应该存储起来
if(flag==false){
newArr[index++] = temp;
}
}
return newArr;
}
}
练习3.
2.用户输入班级的人数,然后依次输入每个同学的成绩.
输入完毕之后,如果及格率没有达到60%, 就为每一位没有及格的成绩加2分,直到及格率达到60%为止。
分析:录入班级的人数和成绩
计算及格率
不及格的加上2分
import java.util.*;
class Demo10
{
public static void main(String[] args)
{
int[] arr ={98,89,45,59}; //readyData();
double rate = getRate(arr); //得到本班 的及格率
while(true){
if(rate<0.6){
for(int i = 0 ; i<arr.length ; i++){
if(arr[i]<60){
arr[i] = arr[i]+2;
}
}
rate = getRate(arr);//重新计算及格率
}else{
break;
}
}
System.out.println("及格率:"+ rate*100+"% ,数组的元素是:"+ Arrays.toString(arr));
}
//计算及格率
public static double getRate(int[] arr){
double count = 0 ; //定义一个变量记录及格的人数
for(int i = 0 ; i<arr.length ; i++){
if(arr[i]>=60){
count++;
}
}
double rate = count/arr.length; // rate 记录及格率的
return rate;
}
//准备数据
public static int[] readyData(){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入班级的人数:");
int count = scanner.nextInt();
//创建一个数组对象
int[] arr = new int[count];
//录入学生的成绩
for(int i = 0 ; i<count ; i++){
System.out.println("请第"+(i+1)+"位同学的分数:");
arr[i] = scanner.nextInt();
}
return arr;
}
}
|