時間複雜度
有序陣列
無序陣列
增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 以二倍的速度增長,也就是說到...