1.数组的介绍
数组:一组类型相同的数据
1.为什么不能存放不同的数据类型?
每种数据类型在内存空间中占据的大小不同
2.为什么要用到数组?
业务所需,需要对多个同种数据类型的数据进行打包处理。
2.排序的介绍
排序是将一群数据,按照指定的顺序进行排列的过程。
3.排序的分类
内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序、选择排序和插入排序)
外部排序:数据量过大,无法加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法)
3、排序(Sorting)是数据处理中一种很重要的运算,同时也是很常见的运算,一般数据处理工作的25%的时间都是在进行排序。简单地讲,排序就是把一组记录(元素)按照某个域的值的递增或者递减的次序重新排列的过程。
4.遍历数组的三种方法
private static void fun1(int[] arr) {
for(int i=0;i<arr.length;i++){//1.for循环遍历数组
System.out.println(arr[i]);
}
for(int i:arr){//2.增强for循环遍历数组
System.out.println(i);
}
System.out.println(Arrays.toString(arr));
//3.调用方法遍历数组
}
5.向数组中插入数据
import java.util.Arrays;
public class Demo02 {
public static void main(String[] args) {
fun1();
}
//向数组中插入一个数据
private static void fun1() {
int [] arr = {10,20,30,40,50,60,70,0};
int x = 10;//要进行插入的数据
//1.查找应插入的下标
int index=arr.length-1;
//因为没有到数组最后一个,所以默认为最后一个
for(int i=0 ; i<arr.length ; i++){//遍历数组
if(arr[i]>x){
index=i;//记录插入下标
break;//结束循环
}
}
//2.数组从index开始向后移动一位
for(int i=arr.length-2;i>=index;i--){
arr[i+1]=arr[i];
}
//3.插入数据替换arr[index]
arr[index]=x;
//输出数组
System.out.println(Arrays.toString(arr));
}
}
6.冒泡排序
原理:每次比较两个相邻的元素,将较大的元素交换至右端。
思路:每次冒泡排序操作都会将相邻的两个元素进行比较,看是否满足大小关系要求,如果不满足,就交换这两个相邻元素的次序,一次冒泡至少让一个元素移动到它应该排列的位置,重复N次,就完成了冒泡排序。
public class Demo02 {
public static void main(String[] args) {
//冒泡详解
int [] arr={3,4,5,2,6,1};
for(int i=1;i<arr.length;i++){
//第一轮循环,次数arr.length-1,
for(int j=0;j<arr.length-i;j++){
//第二轮循环,次数arr.length-i,
// 作用:循环一次比较出一个最大数,移动到后面
if(arr[j]>arr[j+1]){
//arr数组中前一个数比后一个数大时,交换两个数位置
int t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
7.选择排序
1:外层循环:要走几趟,同样是length-1。
2:设置一个最小值。假设第一个就是最小值。
3:设置一个最小值下标
4:内层循环:那你当前的最小值去逐一比较。当有比当前最小值小的数时,记录最小值,记录下标。
5:退出内层循环后就交换位置。
public class Demo03 {
//选择排序
public static void main(String[] args) {
int [] arr={3,4,5,2,1,6,7,8};
//1.找下标
for(int i=0;i<arr.length-1;i++){
int min=i;//定义一个最小数的下标
for(int j=i;j<arr.length;j++){
if(arr[j]<arr[min]){//比较大小,获取最小数下标
min=j;
}
}
int t=arr[min];
arr[min]=arr[i];
arr[i]=t;
}
System.out.println(Arrays.toString(arr));
}
}
8.快速排序
交换式排序法–快速排序法
基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,
整个排序过程可以递归进行,以此达到整个数据变成有序序列。
public static void main(String[] args) {
int [] arr={9,6,5,48,2,3,4};
System.out.println(Arrays.toString( quickSort(arr,0,arr.length-1)));
}
//快速
private static int [] quickSort(int arr[],int l,int r) {//l:表示数组的第一个下标 r:表示数组的最后一个下标
int X=arr[l]; //基准,划分大于X的一边和小于X的一边
int i=l,j=r; //第一次:i=0 , j=arr.length-1
while (i<j){ //循环满足条件跳出循环
//从右向左,找出比X小的数的下标 j
while (i<j&&arr[j]>X){ //查找比X大的数arr[j],并且j向右移动一步
j--;
}
//从左向右,找出比X大的数的下标
while (i<j&&arr[i]<X){ //查找比X小的数arr[i],并且i向左移动一位
i++;
}
if(arr[i]==arr[j]&&i<j){ //不同下标,i++
i++;
}else { //交换数据,比X小到左边,比X大到右边
int t=arr[i];
arr[i]=arr[j];
arr[j]=t;
}
}
if(i-1>l){ //满足i-1>l,调用方法,改变arr.length-1-----变成i-1
arr=quickSort(arr,l,i-1);
}
if(j+1<r){ //满足j+1<r,调用方法,改变0------变成j+1
arr=quickSort(arr,j+1,r);
}
return arr;
}