1,初寫的**,浪費了空間
2,改進後**
3,這裡有個冗餘的操作,就是在函式引數中沒必要有&這個符號,因為光*a這個符號,就會使得當a陣列裡的元素在函式體重改變時,返回後也會改變,加個&只是說*&a這個指標a改變也是可返回的。
4,int *&a;的意思是:a is a reference of a pointer to int;
5,時間複雜度為o(n2),空間代價是o(1)
6,改進需要從減少」查詢「和」移動「兩方面入手,以為插入資料都是在已經有序序列中插入,所以先考慮折半插入排序。
折半插入排序 = 折半查詢到插入位置+移動,相比直接插入排序,減少了查詢操作,但是複雜度一樣。
#define lt(a,b) (a < b)
void binsertsort(sqlist &l)
//對順序表進行折半查詢
for(i = 2;i <= length;i++)
l.r[0] = l.r[i];
low = 1; high = i - 1;
while(low <= high)
mid = (low + high)/2;
if( lt(l.r[0],l.r[mid]) ) high = mid - 1;
else
low = mid + 1;
for(j = i - 1;j >= high + 1;j--)l.r[j + 1] = l.r[j];
l.r[high + 1] = l.r[0];
直接插入排序和折半插入排序
1.直接插入排序 1.1插入排序 insertion sort 的基本思想 每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排序好的序列中,直到全部記錄插入完成為止.1.2 基本過程 假設待排序的記錄存放在陣列r 1.n 中。初始時,r 1 自成1個有序區,無序區為r 2.n 從i 2起直到i ...
直接插入排序和折半插入排序演算法
直接插入排序 insertion sort 的基本思想是 每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子串行中的適當位置,直到全部記錄插入完成為止。設陣列為a 0 n 1 1.初始時,a 0 自成1個有序區,無序區為a 1.n 1 令i 1 2.將a i 併入當前的有序區a 0 i ...
直接插入排序與折半插入排序
首先看一下例子,將資料乙個個的插入到乙個列表中,插入後這個列表就排序好了 注意 這個列表是遞增的,而且記憶體空間已分配好,只是沒有填充真正的資料,如下 int insertsort mergetype l,int data for j l len 1 j 0 j else return 0 測試用例...