程序笔记   发布时间:2022-06-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了数组八大运算大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

数组八大运算

1;冒泡排序

2;选择排序

3;直接插入排序

4;希尔排序

5;快速排序

6;归并排序

7;基数排序

8;堆排序

 

一  冒泡排序

原理;数组元素两两比较,交换位置,大元素向后放。那么经过一轮比较后做大的元素会出现在最大索引处

public class Outer {    public static void main(String[] args) {        //定义一个数组        int[] arr = {14, 10, 30, 32, 71, 51, 23, 40, 99};        for (int j = 0; j < arr.length-1; j++) {//循环次数            for (int i = 0; i < arr.length-1-j; i++) {遍历数组                if(arr[i]>arr[i+1]){                    //定义一个中间交换量,交换位置                    int t = arr[i];                    arr[i] = arr[i + 1];                    arr[i + 1] = t;                }            }        }二 选择排序原理;从0索引开始,依次和后面的元素进行比较,小的元素往前放,经过一轮比较后,最小的元素出现在最小索引处
//定义一个数组int[] arr = {14, 10, 30, 32, 71, 51, 23, 40, 99};for (int j = 0; j < arr.length-1; j++) {//循环次数    for (int i = 1+j; i < arr.length; i++) {//遍历数组        if (arr[j] > arr[i]) {//排序思路            int t = arr[j];            arr[j] = arr[i];            arr[i] = t;        }    }}
三 直接插入排序思路;将一个元素插入到一个长度为m的有序表中,使他仍保持顺序方法一
public class Outer {    public static void main(String[] args) {        //定义一个数组        int[] arr = {14, 10, 30, 32, 71, 51, 23, 40, 99};         //外层循环定义轮次        for (int i = 1; i < arr.length; i++) {        //里曾循环进行比较插入            int j=i;        while(j>0&&arr[j]<arr[j-1]){            int t =arr[j];            arr[j]=arr[j-1];            arr[j-1]=t;            j--;        }        }
方法二
//定义一个数组int[] arr = {14, 10, 30, 32, 71, 51, 23, 40, 99}; //外层循环定义轮次for (int i = 1; i < arr.length; i++) {//里曾循环进行比较插入    for(int j =i;j>0;j--){        if(arr[j]<arr[j-1]){            int t =arr[j];            arr[j]=arr[j-1];            arr[j-1]=t;                    }    }}
四  希尔排序又称缩小增量排序基本思想;先将原表按增量ht分组,每个子文件按照直接插入法排序,同样下一个增量ht/2将文件在分为子文件,在直接插入法排序。直到ht等于1时整个文件拍好。关键;选择合适的增量。插入排序时增量为1的希尔排序。//第一次增量可以选取数组长度的一半.克鲁特序列更高效。
//定义一个数组int[] arr = {14, 10, 30, 32, 71, 51, 23, 40, 99};//克努特序列,希尔排序的最佳增量int jiange =1;while(jiange<=arr.length/3){//如果间隔数小于等于数组长度的3/1,克努特序列成立,定义循环    jiange=jiange*3+1;}//三重for循环for (int h = jiange; h >0; h=(h-1)/3) {//间隔循环,定义间隔    for (int i = h; i < arr.length; i++) {//轮次循环,定义循环轮次        for (int j = i; j > (h-1); j-=h) {//比较循环,间隔为h            if(arr[j]<arr[j-h]){//比较方法体                int t =arr[j];                arr[j]=arr[j-1];                arr[j-1]=t;            }        }    }}
五  快速排序分治法;比大小,在区分1;重数组中去出一个数,作为基准数2;分区;将比这个数大或者等于的数都放在右边小于的放在左边。3;重复左右区间的分区,直到各个区间只有一个数
public class Demo1 {    public static void main(String[] args) {        //定义一个数组        int[]arr={10,3,5,6,2,0,200,40,50,8};        //调用工具类,进行快速排序,传入起始位置,传入结束位置        Outer.quickSort(arr,0, arr.length-1);        //输出结果        System.out.println(Arrays.toString(arr));    }}
public class Outer {//快速排序    public static void quickSort(int[] arr, int start, int end) {        //找出分左右两区的索引位置,然后对左右两区进行递归调用        if (start < end) {            int index = geTindex(arr, start, end);            quickSort(arr, start, index - 1);            quickSort(arr, index + 1, end);        }    }    private static int geTindex(int[] arr, int start, int end) {        int i = start;        int j = end;        int x = arr[i];        while (i<j){        //由后向前找比他小的数,找到后挖出这个数填到前一个坑中        while (i < j && arr[j] >= X) {            j--;        }        if (i < j) {            arr[i] = arr[j];            i++;        }        //由后向前找比他大或者等于的数,找到后挖出这个数填到前一个坑中        while (i < j && arr[i] < X) {            i++;        }        if (i < j) {            arr[j] = arr[i];            j--;        }    }        arr[i] = x;        return i;    }}
六 数组排序之归并排序思路;假设初始序列由n个记录,则可以看成n个有序子序列,每一个子序长度为一,然后凉凉归并得到n/2个长度为2或者一的有序子序列,在两两归并,直到得到一个长度为n的有序序列为止。
       //原始待排数组        //int [] arr={10,30,2,1,0,8,7,5,19,29};        //我们先给一个左右两边时有序的一个数组,先来进行归并操作        int[] arr ={4,5,7,8,1,2,3,6};        //拆分        //归并        guiBing(arr,0,3,arr.length-1);        //    }    private static void guiBing(int[] arr,int starTindex,int centerIndex,int endIndeX){        //定义一个临时数组接受数据        int[] tempArr =new int[endIndex-starTindex+1];        //定义左边数组起始索引        int i =starTindex;        //定义右边数组的起始长度        int j =centerIndex+1;        //定义临时数组的起始索引        int index =0;     //比较两边数组元素大小,往临时数组放     while(i<=centerIndex&&j<=endIndeX){         if(arr[i]<=arr[j]){             tempArr[index] =arr[i];             i++;         }else {             tempArr[index]=arr[j];             j++;         }         index++;     }     //处理剩余元素        while(i<=centerIndeX){            tempArr[index]=arr[i];            i++;            index++;        }        while (j<=endIndeX){            tempArr[index] =arr[j];            j++;            index++;        }        System.out.println(Arrays.toString(tempArr));    }}
七;基数排序通过分配在收集的方式进行排序
public class Outer {    public static void main(String[] args) {   //基数排序。通过分配在收集的方式进行排序        int[] arr ={2,1,5,21,31,444,23,33,47,10,903,124,987,100};        //确定排序轮次        //获取数组中的最大值      //  int max =getMax(arr);        sortArrary(arr);                //输出排序后的数组//        System.out.println(Arrays.toString(arr));    }    private static void sortArrary(int[] arr) {        //定义二维数组,放十个桶。        int[][] tempArr=new int[10][arr.length];        //定义一维数组,统计数组        int[] counts =new int[10];        int max =getMax(arr);        int len = String.valueOf(maX).length();        //循环轮次        for (int i = 0,n=1; i < len; i++,n*=10) {            for (int j = 01;j < arr.length; j++ ) {                                //获取每个位上的数字                int ys = arr[j]/n%10;                tempArr[ys][counts[ys]++]=arr[j];            }            //取出桶中元素            int index =0;            for (int k = 0; k < counts.length; k++) {                if(counts[k]!=0){                    for (int h = 0; h < counts[k]; h++) {                        //桶中取出元素放回原数组                        arr[index]=tempArr[k][h];                        index++;                    }                    counts[k]=0;//清除上一位                }                            }        }    }    private static int getMax(int[] arr) {        int max =arr[0];        for (int i = 1; i < arr.length; i++) {            if(arr[i]>maX){                max=arr[i];            }        }        return max;    }}
八  堆排序思想;1;将待排序的序列造成一个大顶堆,此时整个序列最大值就是顶堆的根节点     2;将其末尾元素进行交换,此时末尾就是最大值     3;然后将n-1个元素重新构造成一个堆。这样会得到n个元素的次小值     4;如此反复,得到有序序列
public class Outer {    public static void main(String[] args) {//定义一个数组          int []arr ={1,0,6,7,2,3,4};        //调整成为顶堆的方法        //定义开始调整的位置        int starTindex=(arr.length-1)/2;        //循环开始        for(int i =starTindex;i>=0;i--){            toMaxHeap(arr,arr.length,i);        }        System.out.println(Arrays.toString(arr));    }    private static void toMaxHeap(int[] arr,int size,int indeX){        //获取左右字节        int leftNodeIndex=index*2+1;        int rightNodeIndex=index*2+2;        //查找最大节点        int maxIndex=index;        if(arr[leftNodeIndex]>arr[maxIndex]&&leftNodeIndex<sizE){            maxIndex=leftNodeIndex;        }        if(arr[rightNodeIndex]>arr[maxIndex]&&rightNodeIndex<sizE){            maxIndex=rightNodeIndex;        }        //我们来调换位置        if(maxIndex!=indeX){            int t= arr[maxIndex];            arr[maxIndex] =arr[index];            arr[index]=t;            //调换完之后可能会影响到下面的子树不是大顶堆,我们还需要再次调换            toMaxHeap(arr,size,maxIndeX);        }    }}

大佬总结

以上是大佬教程为你收集整理的数组八大运算全部内容,希望文章能够帮你解决数组八大运算所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。