研後重新學習資料結構。
#includetypedef int elemtype;
void insertsort(elemtype a,int n);
void binsertsort(elemtype a,int n);
void shellsort(elemtype a,int n);
void print_arr(elemtype a,int n);
int main()
; int arr_num = 8;
printf("原陣列: ");
print_arr(arr,arr_num);
// printf("---直接插入排序---\n");
// insertsort(arr,arr_num);
// print_arr(arr,arr_num);
//// printf("---二分查詢插入排序---\n");
// binsertsort(arr,arr_num);
// print_arr(arr,arr_num);
printf("---希爾排序---\n");
shellsort(arr,arr_num);
print_arr(arr,arr_num);
return 0;
}//直接插入
//將子串行按照順序乙個個排序好,不斷向已經排序好的子串行中插入元素
//穩定
//時間複雜度n~n^2
//空間複雜度1
//比較和移動次數都與初始狀態相關
//比較最好為n-1,最壞為n(n-1)/2,平均比較n^2/4
//移動最好為0,最壞為n(n+1)/2,平均移動n^2/4
void insertsort(elemtype a,int n)
}}//折半插入
//直接插入的變形 在已排序好的子串行中查詢待插入元素的位置,使用二分查詢
//穩定
//時間複雜度 n*log2(n)~n^2
//比較次數與初始狀態無關,始終為n*log2(n)
//移動次數與初始狀態相關,順序為0,逆序為n(n+1)/2,平均移動n^2/4
void binsertsort(elemtype a,int n)
for(j = i - 1; j >= high + 1; j --)
a[high + 1] = a[0];
}}//希爾
//對排序表進行按照 i,i+dk,i+2dk···進行分割,然後進行直接插入排序
//直接插入排序是步長都為1
//不穩定 複雜度n^1.3~n^2
void shellsort(elemtype a,int n)
}printf("第%d次排序: ",count);
print_arr(a,n);//列印每次排序結果
}}void print_arr(elemtype a,int n)
printf("\n");
}
插入排序之折半插入排序(c 實現)
插入排序有直接插入排序,折半插入排序 又叫二分插入排序 鍊錶插入排序,希爾排序等。在排序中屬於穩定排序型別。折半插入排序的演算法思想 1 計算 0 i 1 的中間點,用 i 索引處的元素與中間值進行比較,如果 i 索引處的元素大,說明要插入的這個元素應該在中間值和剛加入i索引之間,反之,就是在剛開始...
c 排序演算法之插入排序
今天在寫pat乙級題的時候第一次聽說插入排序 我一直都是孤陋寡聞,大家諒解 插入排序通過對未排序的資料逐個插入合適的位置而完成排序的工作。思路簡單,使用的也比較多 插入排序演算法通過比較和插入來實現排序,其排序流程如下 1 first,對陣列的前兩個資料進行從小到大排序。2 接著將第三個資料與排好的...
C語言 排序之插入排序
插入排序 英語 insertion sort 是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序在實現上,通常採用in place排序,因而在從後向前掃瞄過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間...