归并排序算法java代码 归并排序算法java代码是什么

数据结构 java开发中常用的排序算法有哪些排序算法有很多,所以在特定情景中使用哪一种算法很重要 。为了选择合适归并排序算法java代码的算法,可以按照建议的顺序考虑以下标准归并排序算法java代码:
(1)执行时间
(2)存储空间
(3)编程工作
对于数据量较小的情形,(1)(2)差别不大 , 主要考虑(3)归并排序算法java代码;而对于数据量大的,(1)为首要 。
主要排序法有归并排序算法java代码:
一、冒泡(Bubble)排序——相邻交换
二、选择排序——每次最小/大排在相应的位置
三、插入排序——将下一个插入已排好的序列中
四、壳(Shell)排序——缩小增量
五、归并排序
六、快速排序
七、堆排序
八、拓扑排序
一、冒泡(Bubble)排序
----------------------------------Code 从小到大排序n个数------------------------------------
void BubbleSortArray()
{
for(int i=1;in;i)
{
for(int j=0;in-i;j)
{
if(a[j]a[j 1])//比较交换相邻元素
{
int temp;
temp=a[j]; a[j]=a[j 1]; a[j 1]=temp;
}
}
}
}
-------------------------------------------------Code------------------------------------------------
效率 O(n2),适用于排序小列表 。
二、选择排序
----------------------------------Code 从小到大排序n个数--------------------------------
void SelectSortArray()
{
int min_index;
for(int i=0;in-1;i)
{
min_index=i;
for(int j=i 1;jn;j)//每次扫描选择最小项
if(arr[j]arr[min_index])min_index=j;
if(min_index!=i)//找到最小项交换,即将这一项移到列表中的正确位置
{
int temp;
temp=arr[i]; arr[i]=arr[min_index]; arr[min_index]=temp;
}
}
}
-------------------------------------------------Code-----------------------------------------
效率O(n2),适用于排序小的列表 。
三、插入排序
--------------------------------------------Code 从小到大排序n个数-------------------------------------
void InsertSortArray()
{
for(int i=1;in;i)//循环从第二个数组元素开始,因为arr[0]作为最初已排序部分
{
int temp=arr[i];//temp标记为未排序第一个元素
int j=i-1;
while (j=0arr[j]temp)/*将temp与已排序元素从小到大比较,寻找temp应插入的位置*/
{
arr[j 1]=arr[j];
j--;
}
arr[j 1]=temp;
}
}
------------------------------Code--------------------------------------------------------------
最佳效率O(n);最糟效率O(n2)与冒泡、选择相同,适用于排序小列表
若列表基本有序,则插入排序比冒泡、选择更有效率 。
四、壳(Shell)排序——缩小增量排序
-------------------------------------Code 从小到大排序n个数-------------------------------------
void ShellSortArray()
{
for(int incr=3;incr0;incr--)//增量递减,以增量3,2 , 1为例
{
for(int L=0;L(n-1)/incr;L)//重复分成的每个子列表
{
for(int i=L incr;in;i =incr)//对每个子列表应用插入排序
{
int temp=arr[i];
int j=i-incr;
while(j=0arr[j]temp)
{
arr[j incr]=arr[j];
j-=incr;
}
arr[j incr]=temp;
}
}
}
}
--------------------------------------Code-------------------------------------------
适用于排序小列表 。
效率估计O(nlog2^n)~O(n^1.5),取决于增量值的最初大小 。建议使用质数作为增量值,因为如果增量值是2的幂 , 则在下一个通道中会再次比较相同的元素 。
壳(Shell)排序改进了插入排序,减少了比较的次数 。是不稳定的排序 , 因为排序过程中元素可能会前后跳跃 。
五、归并排序
----------------------------------------------Code 从小到大排序---------------------------------------
void MergeSort(int low,int high)
{
if(low=high)return;//每个子列表中剩下一个元素时停止
else int mid=(low high)/2;/*将列表划分成相等的两个子列表,若有奇数个元素 , 则在左边子列表大于右侧子列表*/
MergeSort(low,mid);//子列表进一步划分
MergeSort(mid 1,high);
int [] B=new int [high-low 1];//新建一个数组 , 用于存放归并的元素
for(int i=low,j=mid 1,k=low;i=midj=high;k)/*两个子列表进行排序归并,直到两个子列表中的一个结束*/
{
if (arr[i]=arr[j];)
{
B[k]=arr[i];
I;
}
else
{ B[k]=arr[j]; j; }
}
for(;j=high;j,k)//如果第二个子列表中仍然有元素 , 则追加到新列表
B[k]=arr[j];
for(;i=mid;i,k)//如果在第一个子列表中仍然有元素 , 则追加到新列表中
B[k]=arr[i];
for(int z=0;zhigh-low 1;z)//将排序的数组B的 所有元素复制到原始数组arr中
arr[z]=B[z];
}
-----------------------------------------------------Code---------------------------------------------------
效率O(nlogn) , 归并的最佳、平均和最糟用例效率之间没有差异 。
适用于排序大列表,基于分治法 。
六、快速排序
------------------------------------Code--------------------------------------------
/*快速排序的算法思想:选定一个枢纽元素 , 对待排序序列进行分割,分割之后的序列一个部分小于枢纽元素,一个部分大于枢纽元素,再对这两个分割好的子序列进行上述的过程 。*/void swap(int a,int b){int t;t =a ;a =b ;b =t ;}
int Partition(int [] arr,int low,int high)
{
int pivot=arr[low];//采用子序列的第一个元素作为枢纽元素
while (lowhigh)
{
//从后往前栽后半部分中寻找第一个小于枢纽元素的元素
while (lowhigharr[high] = pivot)
{
--high;
}
//将这个比枢纽元素小的元素交换到前半部分
swap(arr[low], arr[high]);
//从前往后在前半部分中寻找第一个大于枢纽元素的元素
while (low high arr [low ]=pivot )
{
low ;
}
swap (arr [low ],arr [high ]);//将这个枢纽元素大的元素交换到后半部分
}
return low ;//返回枢纽元素所在的位置
}
void QuickSort(int [] a,int low,int high)
{
if (low high )
{
int n=Partition (a ,low ,high );
QuickSort (a ,low ,n );
QuickSort (a ,n1,high );
}
}
----------------------------------------Code-------------------------------------
平均效率O(nlogn),适用于排序大列表 。
此算法的总时间取决于枢纽值的位置;选择第一个元素作为枢纽 , 可能导致O(n2)的最糟用例效率 。若数基本有序,效率反而最差 。选项中间值作为枢纽 , 效率是O(nlogn) 。
基于分治法 。
七、堆排序
最大堆:后者任一非终端节点的关键字均大于或等于它的左、右孩子的关键字,此时位于堆顶的节点的关键字是整个序列中最大的 。
思想:
(1)令i=l,并令temp= kl ;
(2)计算i的左孩子j=2i 1;
(3)若j=n-1,则转(4),否则转(6);
(4)比较kj和kj 1,若kj 1kj,则令j=j+1,否则j不变;
(5)比较temp和kj , 若kjtemp,则令ki等于kj,并令i=j,j=2i 1,并转(3),否则转(6)
(6)令ki等于temp,结束 。
-----------------------------------------Code---------------------------
void HeapSort(SeqIAst R)
{ //对R[1..n]进行堆排序 , 不妨用R[0]做暂存单元int I;BuildHeap(R); //将R[1-n]建成初始堆for(i=n;i1;i--) //对当前无序区R[1..i]进行堆排序,共做n-1趟 。{R[0]=R[1]; R[1]=R[i]; R[i]=R[0]; //将堆顶和堆中最后一个记录交换Heapify(R,1,i-1);//将R[1..i-1]重新调整为堆,仅有R[1]可能违反堆性质}} ---------------------------------------Code--------------------------------------
堆排序的时间 , 主要由建立初始堆和反复重建堆这两部分的时间开销构成 , 它们均是通过调用Heapify实现的 。
堆排序的最坏时间复杂度为O(nlgn) 。堆排序的平均性能较接近于最坏性能 。由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件 。堆排序是就地排序,辅助空间为O(1),它是不稳定的排序方法 。
堆排序与直接插入排序的区别:
直接选择排序中 , 为了从R[1..n]中选出关键字最小的记录,必须进行n-1次比较 , 然后在R[2..n]中选出关键字最小的记录 , 又需要做n-2次比较 。事实上,后面的n-2次比较中,有许多比较可能在前面的n-1次比较中已经做过 , 但由于前一趟排序时未保留这些比较结果,所以后一趟排序时又重复执行了这些比较操作 。
堆排序可通过树形结构保存部分比较结果,可减少比较次数 。
八、拓扑排序
例 :学生选修课排课先后顺序
拓扑排序:把有向图中各顶点按照它们相互之间的优先关系排列成一个线性序列的过程 。
方法:
在有向图中选一个没有前驱的顶点且输出
从图中删除该顶点和所有以它为尾的弧
重复上述两步 , 直至全部顶点均已输出(拓扑排序成功),或者当图中不存在无前驱的顶点(图中有回路)为止 。
---------------------------------------Code--------------------------------------
void TopologicalSort()/*输出拓扑排序函数 。若G无回路 , 则输出G的顶点的一个拓扑序列并返回OK,否则返回ERROR*/
{
int indegree[M];
int i,k,j;
char n;
int count=0;
Stack thestack;
FindInDegree(G,indegree);//对各顶点求入度indegree[0....num]
InitStack(thestack);//初始化栈
for(i=0;iG.num;i)
Console.WriteLine("结点" G.vertices[i].data "的入度为" indegree[i]);
for(i=0;iG.num;i)
{
if(indegree[i]==0)
Push(thestack.vertices[i]);
}
Console.Write("拓扑排序输出顺序为:");
while(thestack.Peek()!=null)
{
Pop(thestack.Peek());
j=locatevex(G,n);
if (j==-2)
{
Console.WriteLine("发生错误,程序结束 。");
exit();
}
Console.Write(G.vertices[j].data);
count;
for(p=G.vertices[j].firstarc;p!=NULL;p=p.nextarc)
{
k=p.adjvex;
if (!(--indegree[k]))
Push(G.vertices[k]);
}
}
if (countG.num)
Cosole.WriteLine("该图有环,出现错误,无法排序 。");
else
Console.WriteLine("排序成功 。");
}
----------------------------------------Code--------------------------------------
算法的时间复杂度O(n e) 。
java归并排序.example-btn{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.example-btn:hover{color:#fff;background-color:#47a447;border-color:#398439}.example-btn:active{background-image:none}div.example{width:98%;color:#000;background-color:#f6f4f0;background-color:#d0e69c;background-color:#dcecb5;background-color:#e5eecc;margin:0 0 5px 0;padding:5px;border:1px solid #d4d4d4;background-image:-webkit-linear-gradient(#fff,#e5eecc 100px);background-image:linear-gradient(#fff,#e5eecc 100px)}div.example_code{line-height:1.4em;width:98%;background-color:#fff;padding:5px;border:1px solid #d4d4d4;font-size:110%;font-family:Menlo,Monaco,Consolas,"Andale Mono","lucida console","Courier New",monospace;word-break:break-all;word-wrap:break-word}div.example_result{background-color:#fff;padding:4px;border:1px solid #d4d4d4;width:98%}div.code{width:98%;border:1px solid #d4d4d4;background-color:#f6f4f0;color:#444;padding:5px;margin:0}div.code div{font-size:110%}div.code div,div.code p,div.example_code p{font-family:"courier new"}pre{margin:15px auto;font:12px/20px Menlo,Monaco,Consolas,"Andale Mono","lucida console","Courier New",monospace;white-space:pre-wrap;word-break:break-all;word-wrap:break-word;border:1px solid #ddd;border-left-width:4px;padding:10px 15px}排序算法是《数据结构与算法》中最基本的算法之一 。排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存 。常见的内部排序算法有归并排序算法java代码:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等 。以下是归并排序算法:
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法 。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用 。
作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:
自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法);自下而上的迭代;
在《数据结构与算法 JavaScript 描述》中,作者给出了自下而上的迭代方法 。但是对于递归法,作者却认为:
However, it is not possible to do so in JavaScript, as the recursion goes too deep for the language to handle.
然而,在 JavaScript 中这种方式不太可行,因为这个算法的递归深度对它来讲太深了 。
说实话 , 我不太理解这句话 。意思是 JavaScript 编译器内存太小 , 递归太深容易造成内存溢出吗归并排序算法java代码?还望有大神能够指教 。
和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是 O(nlogn) 的时间复杂度 。代价是需要额外的内存空间 。
2. 算法步骤
申请空间,使其大小为两个已经排序序列之和 , 该空间用来存放合并后的序列;
【归并排序算法java代码 归并排序算法java代码是什么】 设定两个指针,最初位置分别为两个已经排序序列的起始位置;
比较两个指针所指向的元素,选择相对小的元素放入到合并空间 , 并移动指针到下一位置;
重复步骤 3 直到某一指针达到序列尾;
将另一序列剩下的所有元素直接复制到合并序列尾 。
3. 动图演示
代码实现JavaScript实例functionmergeSort ( arr ){// 采用自上而下的递归方法
varlen=arr. length;
if( len
java实现归并排序问题public void mySort(int low,int high){
int lo=low;
int hi=high;
if (lo=hi) {
return;
}else{
boolean flag=false;
while (lohi) {
if (arrs[lo]arrs[hi]) {
int temp=arrs[lo];
arrs[lo]=arrs[hi];
arrs[hi]=temp;
flag=!flag;
}else{
if (flag) {
lo;
}else{
hi--;
}
}
}
lo--;
hi;
mySort(low,lo);
mySort(hi,high);
}
}
这里是递归加二分法(排序的方法) 希望能帮到你?。⊥麀~点赞
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; kgap; k) {var tagArr = [];tagArr.push(arr[k])for (i = k gap; ilen; 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]4605823971
排序后:
[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; iglen; i) {gap = gapArr[i];for (var j = 0; jlen; 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:2left:6 right:3left:1 right:9left:5 right:7left:8 right:0left:2,4 right:3,6left:1,9 right:5,7left:0,8 right:left:2,3,4,6 right:1,5,7,9left: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 归并排序算法问题debug一下,可以监视里面每个变量的值,
不过用断言会更专业一些,
我对算法还不是很在行
逻辑问题还得你慢慢调试
归并排序算法java代码的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于归并排序算法java代码是什么、归并排序算法java代码的信息别忘了在本站进行查找喔 。

    推荐阅读