插入排序:把乙個無序的陣列分為兩部分,一部分為有序(剛開始只有乙個元素),一部分為無序(從第二個元素開始),將無序元素乙個乙個插入到有序元素中。
void insertsort(int
*arr, size_t size)
arr[j] = x;}}
}
直接插入排序耗時的操作有:比較+後移賦值。時間複雜度如下:
1) 最好情況:序列是公升序排列,在這種情況下,需要進行的比較操作需(n-1)次。後移賦值操作為0次。即o(n)
2) 最壞情況:序列是降序排列,那麼此時需要進行的比較共有n(n-1)/2次。後移賦值操作是比較操作的次數加上 (n-1)次。即o(n^2)
3) 漸進時間複雜度(平均時間複雜度):o(n^2)
2. 空間複雜度:o(1)
從實現原理可知,直接插入排序是在原輸入陣列上進行後移賦值操作的(稱「就地排序」),所需開闢的輔助空間跟輸入陣列規模無關,所以空間複雜度為:o(1)
優化改進
1.二分查詢插入排序:利用二分查詢迅速找到插入位置,減少元素比較次數提高效率。
void insertsort(int *arr, size_t size)
arr[j]=temp;}}
}int binarysearchinsert(int arr, size_t size, int data)
else
}if(arr[middle]<=data)
middle++;
return middle;
}
這裡找的是插入位置,不是查詢元素,所以必須比較完所有元素,二分查詢最壞時間複雜度為log2(n)
所以二分查詢插入排序時間複雜度:
最好情況:查詢的位置是有序區的最後一位後面一位,則無須進行後移賦值操作,其比較次數為:log2(n) 。即o(log2(n))
最壞情況:查詢的位置是有序區的第乙個位置,則需要的比較次數為:log2(n),需要的賦值操作次數為n(n-1)/2加上 (n-1) 次。即o(n^2)
漸進時間複雜度(平均時間複雜度):o(n^2)
空間複雜度:o(1)
希爾排序:如果序列本來就是公升序或部分元素公升序,那麼比較+後移賦值操作次數就會減少。希爾排序正是通過分組的辦法讓部分元素公升序再進行整個序列排序。(原因是,當增量值很大時資料項每一趟排序需要的個數很少,但資料項的距離很長。當增量值減小時每一趟需要和動的資料增多,此時已經接近於它們排序後的最終位置。)
void shellsort(int *arr,size_t size)
arr[k+gap] = temp;
} }
} --gap;
} }
時間複雜度: o(nlog2n)
希爾排序耗時的操作有:比較 + 後移賦值。時間複雜度如下:
最好情況:序列是公升序排列,在這種情況下,需要進行的比較操作需(n-1)次。後移賦值操作為0次。即o(n)
最壞情況:o(nlog2n)。
漸進時間複雜度(平均時間複雜度):o(nlog2n)
插入排序及其優化
複雜度o n 2 用筆模擬過程可輕鬆得出 一 思路 index 0 1 2 3 4 5 value 4 3 2 6 4 8 1 選定起始指標index 0,此時已排好順序的子陣列長度為1 就是list 0 4 2 指標後移,候選元素變為list 1 3,將該元素不斷向左交換到某個位置,使得list ...
插入排序及其優化
插入排序 直接插入排序 時間複雜度為o n 2 穩定的排序元素移動是順序的 在乙個陣列中,將第乙個元素看作排序元素序列裡的唯一元素,然後用臨時變數tmp首先存放第二元素,即可在陣列中空第二個元素位置 即此位置可被覆蓋 將第二個元素與有序序列裡面唯一乙個元素進行比較,根據排序條件決定元素是否需要向後移...
插入排序優化
插入排序的是十分常見的o n 2 級別的排序演算法,其排序思路如下 一次迴圈使前n個數都為有序,巢狀的二次迴圈將第n個數插入到前n個數中合適的位置,我的實現 如下 public void insertsort int a,int n else 這個插入排序相對於選擇排序有可以提前結束一層迴圈的特點,...