1.直接插入排序
1.1插入排序
(insertion sort)
的基本思想:
每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排序好的序列中,直到全部記錄插入完成為止.
1.2 基本過程
假設待排序的記錄存放在陣列r[1..n]中。初始時,r[1]自成1個有序區,無序區為r[2..n].從i = 2起直到i = n 為止,依次將r[i]插入當前的有序區r[1..i - 1]中,生成含n個記錄的有序區.
1.3 基本方法
將待插入記錄r[i]的關鍵字從右向左依次與有序區中記錄r[j](j=i - 1, i - 2, ....,1)的關鍵字比較:
1.若r[j]的關鍵字大於r[i]的關鍵字,則將r[j]後移乙個位置
2.若r[j]的關鍵字小於或等於r[i]的關鍵字,則查詢過程結束,j + 1即為r[i]
1.4 插入位置
關鍵字比r[i]的關鍵字大的記錄均已後移,所以j + 1的位置已經騰空,只要將r[i]直接插入到此位置即可完成一趟直接插入排序
時間複雜度
當陣列和要求排序的順序相同時,為
o(n)
當陣列和要求排序的順序相反時,為
o(n * n)
平均時間複雜度為
o(n * n)
空間複雜度 o
(1)
穩定排序
完整c**
//首先實現簡單資料結構的直接插入排序—陣列
#include#include#define size 5
//直接插入排序子函式
void strinsertionsort(int *iptr,int size)
} //*(iptr+j+1)=temp; }}
//主函式
int main()
else high=m-1;
} //移動元素,往後統一挪
for(j=i-1;j>=high+1;j--)//}}
時間複雜度
當陣列和要求排序的順序相同時,為
o(n)
當陣列和要求排序的順序相反時,為
o(n * n)
平均時間複雜度為
o(n * n)
空間複雜度 o
(1)
穩定排序
插入排序之直接插入排序和折半插入排序
插入排序的基本思想是 將記錄分為有序和無序兩個序列。從無序序列中任取乙個記錄,然後根據該記錄的關鍵字大小在有序序列中查詢乙個合適的位置,使得該記錄放入這個位置後,這個有序序列仍然有序。每插入乙個記錄就稱為一趟插入排序,經過多趟插入排序,使得無序序列中的記錄全部插入到有序序列中,則排序完成。直接插入排...
直接插入排序與折半插入排序
首先看一下例子,將資料乙個個的插入到乙個列表中,插入後這個列表就排序好了 注意 這個列表是遞增的,而且記憶體空間已分配好,只是沒有填充真正的資料,如下 int insertsort mergetype l,int data for j l len 1 j 0 j else return 0 測試用例...
直接插入排序和折半插入排序演算法
直接插入排序 insertion sort 的基本思想是 每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子串行中的適當位置,直到全部記錄插入完成為止。設陣列為a 0 n 1 1.初始時,a 0 自成1個有序區,無序區為a 1.n 1 令i 1 2.將a i 併入當前的有序區a 0 i ...