arraylist 執行緒安全_深度解析CopyOnWriteArrayList,執行緒安全版
插入排序原理:
插入排序是指在待排序的元素中,假設前面n-1(其中n>=2)個數已經是排好順序的,現將第n個數插到前面已經排好的序列中,然後找到合適自己的位置,使得插入第n個數的這個序列也是排好順序的。按照此法對所有元素進行插入,直到整個序列排為有序的過程
時間複雜度
1.當待排序陣列是有序時,是最優的情況,只需當前數跟前一個數比較一下就可以了,這時一共需要比較N- 1次,時間複雜度為O(N);
2.最壞的情況是待排序陣列是逆序的,此時需要比較次數最多,總次數記為:1+2+3+…+N-1,所以,插入排序最壞情況下的時間複雜度為O(N²);
3.平均來說,A[1..j-1]中的一半元素小於A[j],一半元素大於A[j]。插入排序在平均情況執行時間與最壞情況執行時間一樣,是輸入規模的二次函式
綜上所述:氣泡排序總的平均時間複雜度為:常數階O(1)。
程式碼如下:
package ca; import java.util.Arrays; public class Insertion { public static void main(String[] args) { int a[]={1,8,5,32,45,9,25,36}; Insertion.sort(a); } public static void sort(int[] a) { //假設將a[]按升序排列 for (int i=1;i<a.length;i++) { //將a[i]插入到a[i-1],a[i-2],a[i-3]……之中 for(int j=i;j>0&&(a[j]<a[j-1]);j--) { int temp=a[j]; a[j]=a[j-1]; a[j-1]=temp; } System.out.println(Arrays.toString(a)); } } }
排序步驟如下:
第一輪比較:第二個數和第一個數比 ,8和1比較,8大於1,不交換位置 [1,8,5,32,45,9,25,36]
第二輪比較:第三個數和第二個數比, 5和8比較,5小於8,交換位置 [1,5,8,32,45,9,25,36]
第三輪比較:第四個數和第三個數比,32和8比較,32大於8,不交換位置 [1,5,8,32,45,9,25,36]
第四輪比較:第五個數和第四個數比,45和32比較,45大於32,不交換位置 [1,5,8,32,45,9,25,36]
第五輪比較:第六個數和第五個數比,9和45比較,9小於45,交換位置 [1,5,8,32,9,45,25,36] ;第五個數和第四個數比 9和32比較, 9小於32,交換位置[1,5,8,9,32,45,25,36]
第六輪比較:第七個數和第六個數比,25和45比較,25小於45,交換位置 [1,5,8,9,32,25,45,36] ;第六個數和第五個數比 25和32比較, 25小於32,交換位置[1,5,8,9,25,32,45,36]
第七輪比較:第八個數和第七個數比,36和45比較,36小於45,交換位置 [1,5,8,9,25,32,36,45] ;第七個數和第六個數比 36和32比較, 36大於32,不交換位置[1,5,8,9,25,32,36,45]