「java合并排序代码解析」合并排序 java

博主:adminadmin 2022-12-29 05:03:08 52

今天给各位分享java合并排序代码解析的知识,其中也会对合并排序 java进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Java 合并排序问题代码出现异常,求解释

看来这个情况,你只有一个办法可以做,就是在 71 行的前面加上一个

System.out.println("k=" + k + ", q=" + q);

一步一步先输出每一个值,然后再往上一步一步找。

java编程合并排序算法

package p1;

import java.util.Arrays;

public class Guy

{

/**

 * 归并排序

 */

private static void mergeSort ( int[] array, int start, int end, int[] tempArray )

{

if (end = start)

{

return;

}

int middle = ( start + end ) / 2;

mergeSort (array, start, middle, tempArray);

mergeSort (array, middle + 1, end, tempArray);

int k = 0, leftIndex = 0, rightIndex = end - start;

System.arraycopy (array, start, tempArray, 0, middle - start + 1);

for ( int i = 0; i  end - middle; i++ )

{

tempArray[end - start - i] = array[middle + i + 1];

}

while (k  end - start + 1)

{

if (tempArray[rightIndex]  tempArray[leftIndex]) // 从小到大

{

array[k + start] = tempArray[leftIndex++];

}

else

{

array[k + start] = tempArray[rightIndex--];

}

k++;

}

}

public static void main ( String[] args )

{

int[] array = new int[] { 11, 213, 134, 65, 77, 78, 23, 43 };

mergeSort (array, 0, array.length - 1, new int[array.length]);

System.out.println (Arrays.toString (array));

}

}

JAVA归并排序算法,有两行代码看不懂

以var a = [4,2,6,3,1,9,5,7,8,0];为例子。

1.希尔排序。 希尔排序是在插入排序上面做的升级。是先跟距离较远的进行比较的一些方法。

function shellsort(arr){ var i,k,j,len=arr.length,gap = Math.ceil(len/2),temp; while(gap0){ for (var k = 0; k gap; k++) { var tagArr = []; tagArr.push(arr[k]) for (i = k+gap; i len; i=i+gap) { temp = arr[i]; tagArr.push(temp); for (j=i-gap; j -1; j=j-gap) { if(arr[j]temp){ arr[j+gap] = arr[j]; }else{ break; } } arr[j+gap] = temp; } console.log(tagArr,"gap:"+gap);//输出当前进行插入排序的数组。 console.log(arr);//输出此轮排序后的数组。 } gap = parseInt(gap/2); } return arr; }

过程输出:

[4, 9] "gap:5" [4, 2, 6, 3, 1, 9, 5, 7, 8, 0] [2, 5] "gap:5" [4, 2, 6, 3, 1, 9, 5, 7, 8, 0] [6, 7] "gap:5" [4, 2, 6, 3, 1, 9, 5, 7, 8, 0] [3, 8] "gap:5" [4, 2, 6, 3, 1, 9, 5, 7, 8, 0] [1, 0] "gap:5" [4, 2, 6, 3, 0, 9, 5, 7, 8, 1] [4, 6, 0, 5, 8] "gap:2" [0, 2, 4, 3, 5, 9, 6, 7, 8, 1] [2, 3, 9, 7, 1] "gap:2" [0, 1, 4, 2, 5, 3, 6, 7, 8, 9] [0, 1, 4, 2, 5, 3, 6, 7, 8, 9] "gap:1" [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

由输出可以看到。第一轮间隔为5。依次对这些间隔的数组插入排序。

间隔为5:

[4, 9] "gap:5" [4, 2, 6, 3, 1, 9, 5, 7, 8, 0] [2, 5] "gap:5" [4, 2, 6, 3, 1, 9, 5, 7, 8, 0] [6, 7] "gap:5" [4, 2, 6, 3, 1, 9, 5, 7, 8, 0] [3, 8] "gap:5" [4, 2, 6, 3, 1, 9, 5, 7, 8, 0] [1, 0] "gap:5" [4, 2, 6, 3, 0, 9, 5, 7, 8, 1] [4, 6, 0, 5, 8] "gap:2" [0, 2, 4, 3, 5, 9, 6, 7, 8, 1] [2, 3, 9, 7, 1] "gap:2" [0, 1, 4, 2, 5, 3, 6, 7, 8, 9] [0, 1, 4, 2, 5, 3, 6, 7, 8, 9] "gap:1" [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

间隔为2:

[4, 2, 6, 3, 0, 9, 5, 7, 8, 1] 4 6 0 5 8 2 3 9 7 1

排序后:

[0, 1, 4, 2, 5, 3, 6, 7, 8, 9]

间隔为1:

排序后:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]。

2.快速排序。把一个数组以数组中的某个值为标记。比这个值小的放到数组的左边,比这个值得大的放到数组的右边。然后再递归 对左边和右边的数组进行同样的操作。直到排序完成。通常以数组的第一个值为标记。

代码:

function quickSort(arr){ var len = arr.length,leftArr=[],rightArr=[],tag; if(len2){ return arr; } tag = arr[0]; for(i=1;ilen;i++){ if(arr[i]=tag){ leftArr.push(arr[i]) }else{ rightArr.push(arr[i]); } } return quickSort(leftArr).concat(tag,quickSort(rightArr)); }

3.归并排序。把一系列排好序的子序列合并成一个大的完整有序序列。从最小的单位开始合并。然后再逐步合并合并好的有序数组。最终实现归并排序。

合并两个有序数组的方法:

function subSort(arr1,arr2){ var len1 = arr1.length,len2 = arr2.length,i=0,j=0,arr3=[],bArr1 = arr1.slice(),bArr2 = arr2.slice(); while(bArr1.length!=0 || bArr2.length!=0){ if(bArr1.length == 0){ arr3 = arr3.concat(bArr2); bArr2.length = 0; }else if(bArr2.length == 0){ arr3 = arr3.concat(bArr1); bArr1.length = 0; }else{ if(bArr1[0]=bArr2[0]){ arr3.push(bArr1[0]); bArr1.shift(); }else{ arr3.push(bArr2[0]); bArr2.shift(); } } } return arr3; }

归并排序:

function mergeSort(arr){ var len= arr.length,arrleft=[],arrright =[],gap=1,maxgap=len-1,gapArr=[],glen,n; while(gapmaxgap){ gap = Math.pow(2,n); if(gap=maxgap){ gapArr.push(gap); } n++; } glen = gapArr.length; for (var i = 0; i glen; i++) { gap = gapArr[i]; for (var j = 0; j len; j=j+gap*2) { arrleft = arr.slice(j, j+gap); arrright = arr.slice(j+gap,j+gap*2); console.log("left:"+arrleft,"right:"+arrright); arr = arr.slice(0,j).concat(subSort(arrleft,arrright),arr.slice(j+gap*2)); } } return arr; }

排序[4,2,6,3,1,9,5,7,8,0]输出:

left:4 right:2 left:6 right:3 left:1 right:9 left:5 right:7 left:8 right:0 left:2,4 right:3,6 left:1,9 right:5,7 left:0,8 right: left:2,3,4,6 right:1,5,7,9 left:0,8 right: left:1,2,3,4,5,6,7,9 right:0,8

看出来从最小的单位入手。

第一轮先依次合并相邻元素:4,2; 6,3; 1,9; 5,7; 8,0

合并完成之后变成: [2,4,3,6,1,9,5,7,0,8]

第二轮以2个元素为一个单位进行合并:[2,4],[3,6]; [1,9],[5,7]; [0,8],[];

合并完成之后变成:[2,3,4,6,1,5,7,9,0,8]

第三轮以4个元素为一个单位进行合并:[2,3,4,6],[1,5,7,9]; [0,8],[]

合并完成之后变成: [1,2,3,4,5,6,7,9,0,8];

第四轮以8个元素为一个单位进行合并: [1,2,3,4,5,6,7,9],[0,8];

合并完成。 [0,1,2,3,4,5,6,7,8,9];

java怎么把两个从小到大排序的一维数组合并成一个从小到大排序的一维数组 求代码和详细解释 万分感谢

public static void main(String[]args)

{

//创建数组

String[] a = { "0", "3", "2", "1" };

String[] b = { "8", "7", "6", "5", "4" };

String[] c = new String[a.length + b.length];

//复制数据

System.arraycopy(a, 0, c, 0, a.length);

System.arraycopy(b, 0, c, a.length, b.length);

//利用 Arrays排序

Arrays.sort(c);

//遍历展示数据

for(String _var : c)

{

System.out.println(_var);

}

}

基本思路就是这样..先合并 然后排序 然后输出..

希望能够帮助到你.. 合并的时候还有其他的方法..有兴趣你可以去了解下 ~~

Java编程技巧:列表排序代码分析

在Java Collection Framework中定义的List实现有Vector ArrayList和LinkedList 这些集合提供了对对象组的索引访问 他们提供了元素的添加与删除支持 然而 它们并没有内置的元素排序支持 你能够使用java util Collections类中的sort()方法对List元素进行排序 你既可以给方法传递一个List对象 也可以传递一个List和一个Comparator 如果列表中的元素全都是相同类型的类 并且这个类实现了Comparable接口 你可以简单的调用Collections sort() 如果这个类没有实现Comparator 你也可以传递一个Comparator到方法sort()中 进行排序 如果你不想使用缺省的分类顺序进行排序 你同样可以传递一个Comparator到方法sort()中来进行排序 如果列表中的元素并不都是相同类型的类 你在进行排序的时候就不是这样幸运了 除非你编写一个专用的跨类的Comparator 排序的顺序怎么样呢?如果元素是String对象 却省的排序顺序是按照字符编码进行的 基本上是每个字符的ASCII/Unicode值 如果严格的限制在处理英文 却省的排序顺序通常是足够的 因为它首先排A Z 然后是小写字母a z 然而如果你处理非英文字 或者你只是想使用不同的排序顺序 这样Collections sort()就出现了第二种变化 例如 你想使用字符串的反序进行排序 为了实现这个功能 你可以在Collections类中通过reverseOrder()来获取一个反序Comparator 然后 你将反序Comparator传递给sort()方法 换句话说 你作如下工作 List list = ;Comparator p = Collections reverseOrder();Collections sort(list p); 如果列表包含项目 Man man Woman 和woman 排序好的列表将是Man Woman man woman 这里没有什么复杂的 需要注意的非常重要的一点是Collections sort()是进行原位排序 如果你需要保留原序 需要先对原集合进行复制 在排序 就像这样 List list = ;List copyOfList = new ArrayList(list);Collections sort(copyOfList); 这里 排好序的列表是 Man Woman man woman 但是原始列表(Man man Woman woman)被保留了 到目前为止 排序是区分大小写的 你如何进行不去分大小写的排序呢?一种实现方式是象这样实现Comparator: public static class CaseInsensitiveComparator implements Comparator {public int pare(Object element Object element ) {String lower = element toString() toLowerCase();String lower = element toString() toLowerCase();return pareTo(lower );}} 你确实不需要手工的创建这个类 而是 你可以是用以存在的Comparator CASE_INSENSIVTIVE_ORDER 它是在String类中定义的 这种实现方式有一点小小的问题 Sort()算法提供稳定的排序 并保持与原有序列相同的元素 这意味着一个包含两个元素 woman 和 Woman 的列表将有不同的排序 而这种不同是根据两个元素在列表中出现的先后次序决定的 语言的不同又会怎么样呢?java text包提供了Collector和CollectionKey类来进行区分语言的排序 这里是例子:注意 如果你的文本是本地语言 而不是缺省语言 你需要传递一个本地语种给getInstance()方法 就象: public static class CollatorComparator implements Comparator {Collator collator = Collator getInstance();public int pare(Object element Object element ) {CollationKey key = collator getCollationKey(element toString());CollationKey key = collator getCollationKey(element toString());return pareTo(key );}} 你是在对集合关键字进行排序 而不是实际的字符串 这不仅提供固定的不区分大小写的排序 而且它是跨语种的排序 换句话说 如果你对西班牙文和非西班牙文的混合词进行排序 词ma?ana (tomorrow)将排在mantra的前面 如果你不使用Collector ma?ana将排在mantra的后面 下面这个程序对一个列表进行不同类型的排序(缺省的 区分大小写的 区分语种的) import java awt BorderLayout;import java awt Container;import java io *;import java text *;import java util *;import javax swing *;public class SortIt {public static class CollatorComparator implements Comparator {Collator collator = Collator getInstance();public int pare(Object element Object element ) {CollationKey key = collator getCollationKey(element toString());CollationKey key = collator getCollationKey(element toString());return pareTo(key );}}public static class CaseInsensitiveComparator implements Comparator {public int pare(Object element Object element ) {String lower = element toString() toLowerCase();String lower = element toString() toLowerCase();return pareTo(lower );}}public static void main(String args[]) {String words[] = { man Man Woman woman Manana manana ma?ana Ma?ana Mantra mantra mantel Mantel };// Create frame to display sortingsJFrame frame = new JFrame( Sorting );frame setDefaultCloseOperation(JFrame EXIT_ON_CLOSE);Container contentPane = frame getContentPane();JTextArea textArea = new JTextArea();JScrollPane pane = new JScrollPane(textArea);contentPane add(pane BorderLayout CENTER);// Create buffer for outputStringWriter buffer = new StringWriter();PrintWriter out = new PrintWriter(buffer);// Create initial list to sortList list = new ArrayList(Arrays asList(words));out println( Original list: );out println(list);out println();// Perform default sortCollections sort(list);out println( Default sorting: );out println(list);out println();// Reset list list = new ArrayList(Arrays asList(words));// Perform case insensitive sortComparator p = new CaseInsensitiveComparator();Collections sort(list p);out println( Case insensitive sorting: );out println(list);out println();// Reset listlist = new ArrayList(Arrays asList(words));// Perform collation sortp = new CollatorComparator();Collections sort(list p);out println( Collator sorting: );out println(list);out println();// Fill text area and displaytextArea setText(buffer toString());frame pack();frame show();}} 如果你的主要问题是顺序访问 可能列表不是你的好的数据结构选择 只要你的集合没有重复 你可以在树(TreeSet)中保存你的元素(提供或不提供Comparator) 这样 元素将总是排序形式的 lishixinzhi/Article/program/Java/hx/201311/26066

java合并排序

代码

可以看出楼主是一个

新手

,你的这个错误是

Comparable

a[]

=

{3,

6,

4,

12,

8,

5,

14

};这里,

3,6,4这些数据不是Comparable

实现类,为什么会不是呢?为什么会在这里出错呢?我猜测楼主的这个代码曾经在别的环境下可以运行的,你这里错误的应该是

你现在

的JDK是1.4的,活着你的编译环境是1.4的,而要Comparable

a[]

=

{3,

6,

4,

12,

8,

5,

14

};能被正常编译需要在1.5的环境下,因为1.5的

特性

使得3,6,4这些

数字

可以当作一个Integer

对象

来处理,而Integer类是实现了Comparable

接口

的。

下面是如果你是用eclipse的话,右键点击项目--properties---JAVA

compiler修改编译环境

java合并排序代码解析的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于合并排序 java、java合并排序代码解析的信息别忘了在本站进行查找喔。

The End

发布于:2022-12-29,除非注明,否则均为首码项目网原创文章,转载请注明出处。