時間複雜度與排序演算法

2021-08-07 07:32:42 字數 3945 閱讀 1093

時間複雜度

有序陣列

無序陣列

增n/2+lo

g2n log

2n

1刪n/2+lo

g2n log

2n

n改log2

n log

2n

n/2查lo

g2n log

2n

n/2插入

n/2+lo

g2n log

2n

n/2

在查詢比較頻繁的情況下,可以考慮使用有序陣列,其它情況一律使用無序陣列。

陣列共有的缺點是插入比較慢,刪除比較慢,新增時無序快,有序慢。然後大小固定。

鍊錶查詢指定位置的元素,時間複雜度為n/2,查詢指定元素也是n/2.

陣列查詢指定位置的元素,時間複雜度為常量1,查詢指定元素為n/2.

查詢的話,看是根據位置查詢,還是根據元素查詢,後者的話,二種方式差距不大。

陣列刪除指定位置的元素,時間複雜度為n/2,刪除指定元素為n

鍊錶刪除指定位置的元素,時間複雜度為n/2,刪除指定元素為n/2.

但是這兩個雖然都是n/2,但是鍊錶的刪除更快,因為鍊錶只需要找到元素,移除就行了,而陣列是要移動後面的元素的。所以鍊錶的刪除更快,但是如果一直都是刪除末尾的元素的話,陣列比煉表好用。

插入的話,同刪除一樣。

修改的話,陣列有絕對優勢。當然,如果是根據元素修改而不是指定位置,二者差別不大(陣列還是佔優)。

下面是排序演算法:

氣泡排序

public

static

void maopaosort(int array)}}

}

仿冒泡:

public void maopaosort(int array)

}swap(array,i,bigger);

}}

插入排序是比氣泡排序和選擇排序更快的一種演算法,實現也複雜一些。

public

static

void charusort(int array)

array[j]=temp;

}}

遞迴版插入排序:

public

static

void insertsortrecursion(int array,int n)else

}array[i]=temp;

}public

static

void diguicharupaixu(int array,int n)

}public

static

void main(string args)

diguicharupaixu(array,0);

// guibing(array,0,array.length-1);

//intsortguibing(array,0,0,1);

for (int a:array)

}結果:

-2076178252__-2014573909__-1812486437__-1172028779__-1128074882__229403722__688081923__809509736__1717241110__1791060401__

希爾排序:它是插入排序的公升級版

特點是在最好與最壞的情況下,時間複雜度都差不多,也就是穩定。他比冒泡,插入、選擇排序都要快些。不如快速排序。

public

class xier

arraysh.display();

arraysh.shellsort();

arraysh.display();

}}class arraysh

public

void

insert(long

value)

thearray[nelems]=value;

nelems++;

}public

void

display()

system.out.println(" ");

}public

void

shellsort()

while(h>0)

thearray[inner]=temp;

}h=(h-1)/3;}}

}

歸併排序法(時間複雜度nlogn):

public

static

void

main(string args)

}結果:

-2014573909__-1172028779__1717241110__

public

static

void

guibing(int array,int start,int end)

/*** 排序陣列

*@param array 待排序陣列

*@param array1start 有序部分1的起始位置

*@param endandstart 有序部分1的終止位置,也是有序部分2 的起始位置

*@param array2end 有序部分2的終止位置

*/public

static

void

intsortguibing(int array, int array1start, int endandstart, int array2end)

else

}int temp1=0;

int temp2=0;

//合併陣列

while (array1start<=array2end)

else

if (temp1==len1)

else

}}

快速排序法

演算法思想:基於分治的思想,是氣泡排序的改進型。首先在陣列中選擇乙個基準點,然後分別從陣列的兩端掃瞄陣列,設兩個指示標誌(lo指向起始位置,hi指向末尾),首先從後半部分開始,如果發現有元素比該基準點的值小,就交換lo和hi位置的值,然後從前半部分開始掃秒,發現有元素大於基準點的值,就交換lo和hi位置的值,如此往復迴圈,直到lo>=hi,然後把基準點的值放到hi這個位置。一次排序就完成了。以後採用遞迴的方式分別對前半部分和後半部分排序,當前半部分和後半部分均有序時該陣列就自然有序了。

public

void kuaisusort(int arrary,int lef,int right)

public

int fenge(int array,int lef,int right)

array[lef]=temp;

return right;

}

快速排序在序列中元素很少時,效率將比較低.

三向切分快速排序法,適合重複元素多的陣列:

public static void sanxiang(int array,int

left,int

right)

int begin=left;

intend=right;

int temp=left+1;

int tempvalue=array[left];

while (temp<=right)

else

if (array[temp]int tt=array[left];

array[left]=array[temp];

array[temp]=tt;

left++;

temp++;

}else

}sanxiang(array,begin,left);

sanxiang(array,right+1,end);

}

排序演算法空間複雜度與時間複雜度總結

演算法 空間複雜度 時間複雜度 平均 最壞 穩定性氣泡排序 o 1 o n2 o n2 穩定選擇排序 o 1 o n2 o n2 不穩定插入排序 o 1 o n2 o n2 穩定希爾排序 o 1 o nlogn o ns s為步長 不穩定快速排序 o logn o n logn o n2 不穩定歸併...

常用排序演算法的時間複雜度與空間複雜度

常用的排序演算法的時間複雜度和空間複雜度 排序法 最差時間分析 平均時間複雜度 穩定度 空間複雜度 氣泡排序 o n2 o n2 穩定 o 1 快速排序 o n2 o n log2 n 不穩定 o log2 n o n 選擇排序 o n2 o n2 穩定 o 1 二叉樹排序 o n2 o n log...

排序演算法 時間複雜度和空間複雜度

常數階o 1 無論 執行了多少行,只要沒有迴圈複雜結構,那麼這個的時間複雜度就是o 1 o 1 時間複雜度 沒有迴圈結構的順序執行,無論執行多少行,時間複雜度均為o 1 public static voido1 對數階o log2n o log2n 時間複雜度 此處 i 以二倍的速度增長,也就是說到...