排序演算法 1 直接插入排序及其改進

2021-06-14 11:19:46 字數 1648 閱讀 1070

參考文章: 

該文章對插入排序的演算法,是錯誤的。

直接插入排序

原理:將陣列分為無序區和有序區兩個區,然後不斷將無序區的第乙個元素按大小順序插入到有序區中去,最終將所有無序區元素都移動到有序區完成排序。

要點:設立哨兵,作為臨時儲存和判斷陣列邊界之用。

實現:(我重新寫了乙個)

[cpp]view plain

copy

#include 

using

namespace

std;  

void

insertsort(

intnum, 

intlength)  

}  }  }  

intmain()  

;  insertsort(num, 6);  

for(

inti = 0; i < 6; i++)  

return

0;   

}  

我們可以看到將無序區域的乙個元素插入乙個有序的時候,上述**是乙個乙個比較,並且移位。將乙個元素插入乙個有序的序列,是否可以利用二分查詢優化呢。於是,我又對上述**進行了改進:

[cpp]view plain

copy

#include 

using

namespace

std;  

intfindindex(

intnum, 

intlength, 

intval)  

else

if(num[lower] <= val)  

right = lower;  

}  } while

(left <= right);  

return

middle;  

}  void

insertsort(

intnum, 

intlength)  

}  intmain()  

;  insertsort(num, 8);  

for(

inti = 0; i < 8; i++)  

return

0;   

}  

知識點:

1、memcpy不考慮重疊的情況;memmove考慮了重疊的情況。

2、int *pi; char *pc; void *pv; 假設指標的初始化的值都是0x0012ff40。

則pi+1的值是0x0012ff44; pc+1的值是0x0012ff41; pv+1編譯錯誤,未知大小(型別)。針對32位系統。

3、對插入排序演算法的優化。

4、對該插入的位置查詢,二分查詢的變種。

再給出乙個標準二分查詢演算法:

[cpp]view plain

copy

intbinarysearch(

intarray, 

intlength, 

intitem)  

else

if(array[middle] < item)  

else

}  return

-1;  

}  

直接插入排序 改進演算法 折半插入排序

這種改進是從比較次數入手的,並沒用減少移動的次數 include define maxsize 20 typedef int keytype typedef struct sqlist void createsqlist sqlist l l.length n void display sqlist...

排序演算法1 直接插入排序

排序分為兩大類,內部排序和外部排序,內部排序指的是待排序記錄存放在計算機隨機儲存器中進行排序過程,外部排序指的是待排序記錄數量很大,以致記憶體不能一次容納全部記錄,在排序過程中尚需對外存進行訪問的排序過程,這裡我主要給出內部排序 其中穩定排序 插入排序 氣泡排序 歸併排序 基數排序。直接插入排序 穩...

插入排序 1 直接插入排序

插入排序 插入排序的演算法思想是 在乙個有序 的元素序列中,不斷地將新元素插入到該已經有序的元素序列中的合適位置,直到所有元素都插入到合適位置則完成排序。直接插入排序 假設待排序的元素有n個,對應的元素分別是a1,a2,a3,a4.因為第乙個元素是有序的,所以從第二個元素開始,將a2與a1進行比較。...