算法描述
假设待排数据存放在一维数组L[n]
中,待排表在某一时刻的状态可分为三部分:(1)前面i
个数据L[0],···,L[i-1]
是已经使用直接插入排序排好的有序子表,简记为A
。(2)第i
个元素L[i]
是本轮排序待排元素,简记为B。(3)后面n-i-1
个元素L[i+1],···,L[n]
是未排序的原始数据,简记为C。
每一轮排序需要做三件事:(1)找到B在A中的插入位置k
;(2)将L[n]
中位置k
(包括L[k]
)到i
之间所有元素往后移一位;(3)将B复制覆盖元素L[k]
。
从第二个元素到最后一个元素,需要进行n-1
轮上述排序操作。
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| #include <iostream> #include <fstream> // 从文件中读入数组元素 using namespace std;
const int n = 8;
void insert_sort(int arr[], int i){ int j = 0, elem = arr[i]; while(arr[j] < elem && j < i) j++; for(int k=i; k>j; --k) arr[k] = arr[k-1]; arr[j] = elem; }
int main(){ ifstream inFile; inFile.open("in.txt"); int *arr = new int[n];
for(int i=0; i<n; ++i) inFile >> arr[i]; for(int i=0; i<n; ++i) insert_sort(arr, i);
for(int i=0; i<n; ++i) cout << arr[i] << " ";
inFile.close(); delete[] arr; return 0; }
|
算法分析
(1)时间复杂度为O(n2),空间复杂度为O(1)。(2)是个稳定的排序方法。(3)适用于以顺序表和链表形式存储的数据。
转载请注明来源:©Tinshine