在学习希尔排序
#include
#include
void swap (int *a, int *b)
{
int tem;
tem = *a;
*a = *b;
*b = tem;
}
void Shell_Sort (int a[], int n)//希尔排序,由小到大
{
int gap = 1;
int i, j;
while (gap < n/3)
{
gap = 3*gap + 1;//最大gap
}
while (gap > 0)
{
for (i = gap; i < n; ++i)
{
for (j = i - gap; j >= 0 && a[j] > a[i]; j -=gap)//如果比同一组的前一个大则交换位置
{
swap (&a[i], &a[j]);
}
}
gap = gap/3;
}
}
int main ()
{
system ("color f0");
int a[6], i;
for(i = 0; i < 6; i++)
{
scanf("%d", &a[i]);
}
Shell_Sort(a, 6);
for(i = 0; i < 6; i++)
{
printf("a[%d] = %d\t", i, a[i]);
}
return 0;
}
没什么思路……
#include <stdio.h>
void group_sort(int a[], int n,int i,int gap) {
int j;
for (j = i + gap; j < n; j += gap) {
// 如果a[j] < a[j-gap],则寻找a[j]位置,并将后面数据的位置都后移。
if (a[j] < a[j - gap]) {
int tmp = a[j];
int k = j - gap;
while (k >= 0 && a[k] > tmp) {
a[k + gap] = a[k];
k -= gap;
}
a[k + gap] = tmp;
}
}
}
void shell_sort(int a[], int n) {
int i, gap;
// gap为步长,每次减为原来的一半。
for (gap = n / 2; gap > 0; gap /= 2) {
// 共gap个数组,对每一组进行直接插入排序
for (i = 0; i < gap; i++) {
group_sort(a, n, i, gap);
}
}
}
int main() {
int a[6], i;
for(i = 0; i < 6; i++){
scanf("%d", &a[i]);
}
shell_sort(a, 6);
for (int i = 0; i < 6; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}