1. 程式人生 > 其它 >arraylist 執行緒安全_深度解析CopyOnWriteArrayList,執行緒安全版

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]