直接插入排序和折半插入實現

2021-07-04 20:53:39 字數 749 閱讀 7794

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 測試用例...