自己总结的排序算法未完成

来源:互联网 发布:数据库数据一致性问题 编辑:程序博客网 时间:2024/05/29 03:24

这一篇其实已经没什么用了,已经被我分割到各个专项的排序算法里去了~~~留着充数好了大笑

算法是我的绝对弱项,这几天先看了看书,今天凭着自己理解和一些记忆写下来,最主要是需要理解算法是怎么做的,我经常是能很明白是怎么做,代码却老绕进去。。贴出代码,供以后复习用。

public class sortList {//int[]从左至右排序为从小->大/** * 冒泡排序 * 每次相邻的两个数进行比较,每一轮结束后,最左(右)侧就会排好一个最大(小)数, * 下次循环进行时,不需要再对最左(右)侧数进行比较了,所以内部为arr.lenth-i-1 */public static int[] bubbleSort(int[] arr){for(int i=0;i<arr.length;i++){for(int j=0;j<arr.length-i-1;j++){if(arr[j] > arr[j+1]){int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}return null;}/** * 插入排序 * 描述:每遍历一次数组,筛选出最小(大)的数,并将其插入至前方标记位置(即外层循环标记所指处) */public static int[] selectSort(int[] arr){for(int i=0;i<arr.length;i++){int flag = i;//找出数组中最小(大)的数,并记下其所处位置for(int j=i+1;j<arr.length;j++){if(arr[j] < arr[flag]){flag = j;}}int temp = arr[i];arr[i] = arr[flag];arr[flag] = temp;}return null;}/** * 插入排序 * 默认arr[0]是一个已经排序好的数,虽然只有一个数, * 第一轮开始,从第二个数arr[1]和arr[0]比较,如果小于arr[0], * arr[0]就挪到arr[1],跳出内部循环,到外部循坏时,arr[0]已经被往后挪了(虽然他的值还有), * 所以外部循环时再把被挤掉的数据放到arr[0]处 */public static int[] insertSort(int[] arr){for(int i=1;i<arr.length;i++){int temp = arr[i];int flag = i;while((temp < arr[flag-1]) && (flag > 0)){arr[flag] = arr[flag - 1];flag--;}arr[flag] = temp;}return null;}public static void main(String[] args){int[] arr = {1,10,2,5,3,5,23,6,9,8};System.out.println("排序前数组:");for(int i=0;i<arr.length;i++){System.out.print(arr[i]+" ");}//bubbleSort(arr);//selectSort(arr);insertSort(arr);System.out.println("");System.out.println("排序后数组:");for(int i=0;i<arr.length;i++){System.out.print(arr[i]+" ");}}}

接下来总结的是归并排序。

归并排序是通过递归,每次将一个数组从中间(mid=(upperBound+lowerBound)/2)分成两个数组,一直分到还有一个数据项的数组,之后调用合并的方法进行排序和合并,之后递归返回再把上一层合并的数组再进行合并,直到全部合并完成。

package sortAlgorithm;public class MergeList {/** * 归并排序 * @param args */public static void mergeSort(int[] arr,int lowerBound,int upperBound,int[] temp){if(lowerBound == upperBound){//如果分成了只有一个数据项,那么返回,将两个数组(各自只有一个数据项)进行合并;return;}else{//计算数组中间的标号int mid = (upperBound + lowerBound) / 2;//从中间进行分割,分割为两个数组下标分别为lowerBound~mid和mid+1~upperBoundmergeSort(arr,lowerBound,mid,temp);mergeSort(arr,mid+1,upperBound,temp);//将上述两个数组进行合并merge(arr,lowerBound,mid,upperBound,temp);}}//将有二个有序数列a[first...mid]和a[mid...last]合并。 //first对应lowerBound,last对应upperBound,temp[]为用来合并两个数组的数组//最后需要将temp[]内容写到arr[]中public static void merge(int[] arr,int first,int mid,int last,int[] temp){//count用来计数,计temp[]当前下标int count = 0;//first,last,mid不应随着变化,后边需要用,所以用其他变量进行计算。int i = first,j = mid;int m = mid + 1,n = last;//以下,两个有序数组,合并至temp[]中,比较两个有序数组的第一项即可,比较后,将大(小)的直接放入temp中while(i <= j && m <= n){if(arr[i] < arr[m]){temp[count++] = arr[i++];}else{temp[count++] = arr[m++];}}//当其中一个有序数组已经全部放入temp[]中时,后续只要将还未放至temp[]中的数据项依次放进去即可(因为是有序的,所以直接放入即可)while(i <= j){temp[count++] = arr[i++];}while(m <= n){temp[count++] = arr[m++];}//此处,将temp[]的内容赋给arr,完成一次合并for(i=0;i<count;i++){arr[first+i] = temp[i];}}public static void main(String[] args){int[] arr = {1,10,2,5,3,5,23,6,9,8};int[] temp = new int[arr.length];System.out.println("排序前数组:");for(int i=0;i<arr.length;i++){System.out.print(arr[i]+" ");}mergeSort(arr,0,arr.length-1,temp);System.out.println("");System.out.println("排序后数组:");for(int i=0;i<arr.length;i++){System.out.print(arr[i]+" ");}}}






0 0
原创粉丝点击