Java:Is Merge Sort是O(N^2)还是O(N Log(N))
我创建了自己的合并排序实现,并对其进行了测试。然而,我不确定它是应该是O(N Log(N))还是O(N^2),你能看看我的代码并告诉我吗 分类列表Java:Is Merge Sort是O(N^2)还是O(N Log(N)),java,algorithm,mergesort,Java,Algorithm,Mergesort,我创建了自己的合并排序实现,并对其进行了测试。然而,我不确定它是应该是O(N Log(N))还是O(N^2),你能看看我的代码并告诉我吗 分类列表 public abstract class SortedList { public final ArrayList<Integer> params = new ArrayList<Integer>(); public void add(int... params) { for (int par
public abstract class SortedList {
public final ArrayList<Integer> params = new ArrayList<Integer>();
public void add(int... params) {
for (int parameter : params) {
this.params.add(parameter);
}
}
abstract public void sort();
public void print() {
for (int parameter : params) {
System.out.print(parameter + " ");
}
System.out.println();
}
}
public class MargeSort extends SortedList{
private int buffer[];
@Override
public void sort() {
buffer = new int[params.size()];
for(int i = 1; i < params.size(); i *= 2){
sort(i);
}
}
private void sort(int interval) {
for(int i = 0; i < params.size() - interval; i += interval * 2){
sort(i, i + interval, interval);
}
}
private void sort(int index1, int index2, int interval) {
int startingIndex = index1;
int index1MaxValue = index1 + interval;
int index2MaxValue = index2 + interval;
if(index2MaxValue >= params.size()){
index2MaxValue = params.size();
}
int counter = 0;
for(counter = 0; index1 < index1MaxValue && index2 < index2MaxValue; counter++){
int param1 = params.get(index1);
int param2 = params.get(index2);
if(param1 < param2){
buffer[counter] = param1;
index1++;
}
else{
buffer[counter] = param2;
index2++;
}
}
int index, indexMaxValue;
if(index1 < index1MaxValue){
index = index1;
indexMaxValue = index1MaxValue;
}
else{
index = index2;
indexMaxValue = index2MaxValue;
}
while(index < indexMaxValue){
int param = params.get(index);
buffer[counter] = param;
index++;
counter++;
}
for(int i = 0; i < interval * 2 && i + startingIndex < params.size(); i++){
params.set(i + startingIndex, buffer[i]);
}
}
}
公共抽象类分类列表{
public final ArrayList params=new ArrayList();
公共无效添加(int…params){
for(int参数:params){
此.params.add(参数);
}
}
抽象公共空排序();
公开作废印刷品(){
for(int参数:params){
系统输出打印(参数+“”);
}
System.out.println();
}
}
MargeSort
public abstract class SortedList {
public final ArrayList<Integer> params = new ArrayList<Integer>();
public void add(int... params) {
for (int parameter : params) {
this.params.add(parameter);
}
}
abstract public void sort();
public void print() {
for (int parameter : params) {
System.out.print(parameter + " ");
}
System.out.println();
}
}
public class MargeSort extends SortedList{
private int buffer[];
@Override
public void sort() {
buffer = new int[params.size()];
for(int i = 1; i < params.size(); i *= 2){
sort(i);
}
}
private void sort(int interval) {
for(int i = 0; i < params.size() - interval; i += interval * 2){
sort(i, i + interval, interval);
}
}
private void sort(int index1, int index2, int interval) {
int startingIndex = index1;
int index1MaxValue = index1 + interval;
int index2MaxValue = index2 + interval;
if(index2MaxValue >= params.size()){
index2MaxValue = params.size();
}
int counter = 0;
for(counter = 0; index1 < index1MaxValue && index2 < index2MaxValue; counter++){
int param1 = params.get(index1);
int param2 = params.get(index2);
if(param1 < param2){
buffer[counter] = param1;
index1++;
}
else{
buffer[counter] = param2;
index2++;
}
}
int index, indexMaxValue;
if(index1 < index1MaxValue){
index = index1;
indexMaxValue = index1MaxValue;
}
else{
index = index2;
indexMaxValue = index2MaxValue;
}
while(index < indexMaxValue){
int param = params.get(index);
buffer[counter] = param;
index++;
counter++;
}
for(int i = 0; i < interval * 2 && i + startingIndex < params.size(); i++){
params.set(i + startingIndex, buffer[i]);
}
}
}
公共类MargeSort扩展了分类列表{
专用整数缓冲区[];
@凌驾
公共无效排序(){
buffer=newint[params.size()];
对于(int i=1;i=params.size()){
index2MaxValue=params.size();
}
int计数器=0;
用于(计数器=0;index1
sort(int)
被称为lg N
次,其中N=params.size()
。[lg N
在这里和任何地方进一步表示celi(lg N)
]
循环sort(int)
循环N/(interval/2)
次,其中interval在[1..lgN]
中,调用sort(…)
,它执行nr个步骤,这是线性的,取决于它的“间隔”
参数
因此,步骤的数量为:
Sigma(k从1到lgN):(N/(区间/2))*(C*区间)=C*N/2*Sigma(1..lgN)1=C*N*lgN/2
[C是计算内部
排序(…)
成本的常数]仅从代码看,我既没有看到递归调用,也没有看到维护某些索引的堆栈。请澄清合并应在何处进行;事实上,你可能已经实现了一个不同的算法。合并排序是O(nlogn),也就是O(n^2)。这有点难理解,但我明白了。从更深的角度看,我认为C在平均和最坏的情况下等于2,这也是唯一符合逻辑的;)