网站内容管理,大庆市建设局网站上不去,汉化主题Wordpress,app智能开发☞ 程序员进阶必备资源免费送「21种技术方向#xff01;」 ☜作者#xff1a;KaelQ#xff0c;www.jianshu.com/p/5e171281a3871.直接插入排序经常碰到这样一类排序问题#xff1a;把新的数据插入到已经排好的数据列中。将第一个数和第二个数排序#xff0c;然后构成一个有… ☞ 程序员进阶必备资源免费送「21种技术方向」 ☜作者KaelQwww.jianshu.com/p/5e171281a3871.直接插入排序经常碰到这样一类排序问题把新的数据插入到已经排好的数据列中。将第一个数和第二个数排序然后构成一个有序序列将第三个数插入进去构成一个新的有序序列。对第四个数、第五个数……直到最后一个数重复第二步。如何写写成代码首先设定插入次数即循环次数for(int i1;i设定插入数和得到已经排好序列的最后一个数的位数。insertNum和ji-1。从最后一个数开始向前循环如果插入数小于当前数就将当前数向后移动一位。将当前数放置到空着的位置即j1。代码实现如下public void insertSort(int[] a){int lengtha.length;//数组长度将这个提取出来是为了提高速度。int insertNum;//要插入的数for(int i1;i//插入的次数 insertNuma[i];//要插入的数int ji-1;//已经排序好的序列元素个数while(j0a[j]insertNum){//序列从后到前循环将大于insertNum的数向后移动一格 a[j1]a[j];//元素移动一格 j--; } a[j1]insertNum;//将需要插入的数放在要插入的位置。 } }2.希尔排序对于直接插入排序问题数据量巨大时。将数的个数设为n取奇数kn/2将下标差值为k的书分为一组构成有序序列。再取kk/2 将下标差值为k的书分为一组构成有序序列。重复第二步直到k1执行简单插入排序。如何写成代码首先确定分的组数。然后对组中元素进行插入排序。然后将length/2重复1,2步直到length0为止。代码实现如下public void sheelSort(int[] a){int d a.length;while (d!0) { dd/2;for (int x 0; x d; x) {//分的组数for (int i x d; i a.length; i d) {//组中的元素从第二个数开始int j i - d;//j为有序序列最后一位的位数int temp a[i];//要插入的元素for (; j 0 temp a[j]; j - d) {//从后往前遍历。 a[j d] a[j];//向后移动d位 } a[j d] temp; } } } }3.简单选择排序常用于取序列中最大最小的几个数时。(如果每次比较都交换那么就是交换排序如果每次比较完一个循环再交换就是简单选择排序。)遍历整个序列将最小的数放在最前面。遍历剩下的序列将最小的数放在最前面。重复第二步直到只剩下一个数。如何写成代码首先确定循环次数并且记住当前数字和当前位置。将当前位置后面所有的数与当前数字进行对比小数赋值给key并记住小数的位置。比对完成后将最小的值与第一个数的值交换。重复2、3步。代码实现如下public void selectSort(int[] a) {int length a.length;for (int i 0; i length; i) {//循环次数int key a[i];int positioni;for (int j i 1; j length; j) {//选出最小的值和位置if (a[j] key) { key a[j]; position j; } } a[position]a[i];//交换位置 a[i]key; } }4.堆排序对简单选择排序的优化。将序列构建成大顶堆。将根节点与最后一个节点交换然后断开最后一个节点。重复第一、二步直到所有节点断开。代码实现如下public void heapSort(int[] a){ System.out.println(开始排序);int arrayLengtha.length;//循环建堆for(int i0;i-1;i){//建堆 buildMaxHeap(a,arrayLength-1-i);//交换堆顶和最后一个元素 swap(a,0,arrayLength-1-i); System.out.println(Arrays.toString(a)); } }private void swap(int[] data, int i, int j) {// TODO Auto-generated method stubint tmpdata[i]; data[i]data[j]; data[j]tmp; }//对data数组从0到lastIndex建大顶堆private void buildMaxHeap(int[] data, int lastIndex) {// TODO Auto-generated method stub//从lastIndex处节点(最后一个节点)的父节点开始for(int i(lastIndex-1)/2;i0;i--){//k保存正在判断的节点int ki;//如果当前k节点的子节点存在while(k*21lastIndex){//k节点的左子节点的索引int biggerIndex2*k1;//如果biggerIndex小于lastIndex即biggerIndex1代表的k节点的右子节点存在if(biggerIndex//若果右子节点的值较大if(data[biggerIndex]1]){//biggerIndex总是记录较大子节点的索引 biggerIndex; } }//如果k节点的值小于其较大的子节点的值if(data[k]//交换他们 swap(data,k,biggerIndex);//将biggerIndex赋予k开始while循环的下一次循环重新保证k节点的值大于其左右子节点的值 kbiggerIndex; }else{break; } } } }5.冒泡排序一般不用。将序列中所有元素两两比较将最大的放在最后面。将剩余序列中所有元素两两比较将最大的放在最后面。重复第二步直到只剩下一个数。如何写成代码设置循环次数。设置开始比较的位数和结束的位数。两两比较将最小的放到前面去。重复2、3步直到循环次数完毕。代码实现如下public void bubbleSort(int[] a){int lengtha.length;int temp;for(int i0;ifor(int j0;j-1;j){if(a[j]a[j1]){ tempa[j]; a[j]a[j1]; a[j1]temp; } } } }6.快速排序要求时间最快时。选择第一个数为p小于p的数放在左边大于p的数放在右边。递归的将p左边和右边的数都按照第一步进行直到不能递归。代码实现如下public static void quickSort(int[] numbers, int start, int end) {if (start end) {int base numbers[start]; // 选定的基准值(第一个数值作为基准值)int temp; // 记录临时中间值int i start, j end;do {while ((numbers[i] base) (i end)) i;while ((numbers[j] base) (j start)) j--;if (i j) { temp numbers[i]; numbers[i] numbers[j]; numbers[j] temp; i; j--; } } while (i j);if (start j) quickSort(numbers, start, j);if (end i) quickSort(numbers, i, end); }}7.归并排序速度仅次于快排内存少的时候使用可以进行并行计算的时候使用。选择相邻两个数组成一个有序序列。选择相邻的两个有序序列组成一个有序序列。重复第二步直到全部组成一个有序序列。代码实现如下public static void mergeSort(int[] numbers, int left, int right) {int t 1;// 每组元素个数int size right - left 1;while (t size) {int s t;// 本次循环每组元素个数 t 2 * s;int i left;while (i (t - 1) size) { merge(numbers, i, i (s - 1), i (t - 1)); i t; }if (i (s - 1) right) merge(numbers, i, i (s - 1), right); }}private static void merge(int[] data, int p, int q, int r) {int[] B new int[data.length];int s p;int t q 1;int k p;while (s q t r) {if (data[s] data[t]) { B[k] data[s]; s; } else { B[k] data[t]; t; } k; }if (s q 1) B[k] data[t];else B[k] data[s];for (int i p; i r; i) data[i] B[i];}8.基数排序用于大量数很长的数进行排序时。将所有的数的个位数取出按照个位数进行排序构成一个序列。将新构成的所有的数的十位数取出按照十位数进行排序构成一个序列。代码实现如下public void sort(int[] array) {//首先确定排序的趟数;int max array[0];for (int i 1; i array.length; i) {if (array[i] max) { max array[i]; } }int time 0;//判断位数;while (max 0) { max / 10; time; }//建立10个队列; Listqueue new ArrayList();for (int i 0; i 10; i) { ArrayList queue1 new ArrayList();queue.add(queue1); }//进行time次分配和收集;for (int i 0; i time; i) {//分配数组元素;for (int j 0; j array.length; j) {//得到数字的第time1位数;int x array[j] % (int) Math.pow(10, i 1) / (int) Math.pow(10, i); ArrayList queue2 queue.get(x); queue2.add(array[j]);queue.set(x, queue2); }int count 0;//元素计数器;//收集队列元素;for (int k 0; k 10; k) {while (queue.get(k).size() 0) { ArrayList queue3 queue.get(k);array[count] queue3.get(0); queue3.remove(0); count; } } } }以上便是今天的分享希望大家喜欢觉得内容不错的欢迎点击「在看」支持谢谢各位。喜欢文章点个在看