一、很简单的一部分内容 直接看代码就好
#include<stdio.h>
//没有哨兵
void directInsertSort(int a[],int n) {
int i,j;
for(i = 1 ; i < n ; i++) {
if(a[i] < a[i-1]) {
int temp = a[i];
for(j = i -1 ; a[j] > temp && j >= 0 ; j--) {
a[j+1] = a[j];
}
a[j+1] = temp;
}
}
}
//用哨兵的直接插入
void insertSort(int a[],int n) {
int i,j;
for(i = 2 ; i < n ; i++) {
if(a[i] < a[i-1]) {
a[0] = a[i];
for(j = i-1 ; j > 0 && a[j] > a[0] ; j--) { //j没到达哨兵 且 刚才遍历到的元素仍然比当前位置元素小 还应该往前找插入位置
a[j+1] = a[j];
}
a[j+1] = a[0]; //
}
}
}
//希尔排序
void shellSort(int a[] , int n) {
int i,j,d;
d = n/2;
for(d = n/2 ; d >= 1; d/=2) {
//从下面的for循环开始 应该与insertSort对照着看
//当insertSort中变化为1的时候,shellsort中就是变化为 d;
//当shellsort的d=1时,即退化为insertsort
for(i = 1+d ; i < n ; i++) { //插入排序从第二个开始
if(a[i] < a[i-d]) {
a[0] = a[i];
for(j = i-d ; j > 0 && a[j] > a[0] ; j-=d) {
a[j+d] = a[j];
}
a[j+d] = a[0];
}
}
}
}
//用哨兵的二分插入排序
void binaInsertSort(int a[] , int n) {
int i,j,low,high,mid;
for(i = 2 ; i < n ; i++) {
a[0] = a[i];
low = 1;
high = i-1;
while(low <= high) { // while可以找到插入位置 high+1就是插入位置
mid = (low + high) / 2; //除以2别忘了
if(a[mid] > a[0] ) { //记得是与a[0]比较
high = mid - 1;
} else {
low = mid + 1;
}
}
for(j = i - 1 ; j > high ; j--) {
a[j+1] = a[j];
}
a[high+1] = a[0];
}
}
int main() {
int a[] = {-1,1,2,7,3,4,8,9,5,6};
int n = sizeof(a)/sizeof(a[0]);
// directInsertSort(a,9);
// binaInsertSort(a,n);
// insertSort(a,n);
shellSort(a,n);
int i;
for(i = 1 ; i < n ; i++) {
printf("%d ",a[i]);
}
return 0;
}