排序的代碼彙總以及思想概述

1、直接插入排序

void InsertSort(Element A[],int n){
int i,j;
for(i=2;i<=n;++i){//從第二個元素開始排序,0下標做了哨兵
if(A[i].key<A[i-1].key){//i小於前驅,需要往前找,插入到合適的位置
A[0]=A[i];//帶插入元素賦值爲哨兵,避免後移時被覆蓋了
for(j=i-1;A[0].key<A[j].key;--j)//從後往前查找帶插入的位置
A[j+1]=A[j];//向後挪
A[j+1]=A[0];//賦值到插入位置
}
}

1.1、思想概述

2、折半插入排序

//折半查找排序
void InsertSort(int A[],int n){
int i,j,low,high,mid;
for(i=2;i<=n;i++){//依次將2到n插入到前面的有序序列中
A[0]=A[i];//將A[0]暫存到A[i];
low=1;high=i-1;//折半查找的範圍
while(low<=high){
mid=(low+high)/2;
if(A[mid]>A[0])high=mid-1//帶插入元素在mid的左邊
else low=min+1//帶插入元素在中間元素的右邊
}
for(j=i-1;j>=high+1;--j){//爲什麼時high+1,因爲最終的停止位之前就是high+1=low
A[j+1]=A[j];
A[high+1]=A[0];

2.1、思想概述

  1. 第一步還是將從2開始到n的元素插入到有序數組中,對應外層的循環
  2. 第二步時將帶插入元素賦值到哨兵
  3. 接着使用二分查找尋找適合的插入位置
  4. 定義low和high
  5. 開始二分查找
  6. 查找結束,low=high+1,low就是插入位置
  7. 從low到i-1都後移
  8. 插入

3、希爾排序

// 插入排序
void shellsort(int A[],int n){
for(int dk=n/2;dk>=1;dk=dk/2){//確定分組長度
for(i=dk+1;i<=n;++i){//每一個分組的第二個元素,和直接插入排序中從第二個元素開始插入排序時一樣的原理
A[0]=A[i];//i就是帶插入元素
for(int j=i-dk;j>0&&A[0]<A[j];j-=dk)//和直接插入排序一樣,只不過跨度變成了dk
A[j+dk]=A[0];
}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章