本帖最后由 小可爱~ 于 2016-10-25 13:11 编辑
插入算法核心思想:
1 元素拿出来
2 符合条件的元素后移(比较大的元素往后移)
3 把拿出来的元素放到空着的地方
[C] 纯文本查看 复制代码 #define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//1 元素拿出来
//2 符合条件的元素后移(比较大的元素往后移)
void InsertionSort(int *pArray, int len)
{
int i, j;
int k;
int temp;
if (NULL == pArray || len <= 0)
{
return;
}
for (i = 1; i < len; i++)
{
k = i; //待插入的位置
temp = pArray[k];
for (j = i - 1; (j >= 0) && (pArray[j] > temp); j--)
{
pArray[j + 1] = pArray[j]; //元素后移
k = j; //需要插入的位置
}
pArray[k] = temp; //元素插入
}
}
int main(int argc, char *argv[])
{
int ret = 0;
int pArray[] = { 12, 5, 33, 65, 15555, 1 };
int len = sizeof(pArray) / sizeof(int);
InsertionSort(pArray, len);
for (int i = 0; i < len; i++)
{
printf("%d ", pArray[i]);
}
puts("");
system("pause");
return ret;
}
希尔算法
[C] 纯文本查看 复制代码 #define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//不稳定算法
//突破大 O (n ^ 2)
void printBuf(int *pArray, int len)
{
int i = 0;
if (NULL == pArray || 0 >= len)
{
printf("func err printBuf line:%d, file :%s\n", __LINE__, __FILE__);
return;
}
for (i = 0; i < len; i++)
{
printf("%d\t", pArray[i]);
}
puts("");
}
//把大的提出来放到后面
void ShellSort01(int *pArray, int len)
{
int i, j, k, tmp;
int gap = len;
do
{
gap = gap / 3 + 1;
for (i = gap; i < len; i += gap)
{
k = i;
tmp = pArray[k];
// tmp > pArray[j] 这个大于号代表的是数组从大到小还是从小到大
for (j = i - gap; j >= 0 && tmp > pArray[j]; j -= gap)
{
pArray[j + gap] = pArray[j];
k = j;
}
pArray[k] = tmp;
}
} while (gap > 1);
}
void ShellPort02(int *pArray, int len)
{
int i, j, k, tmp;
int gap = len;
do
{
gap = gap / 3 + 1;
for (i = gap; i < len; i += gap)
{
k = i;
tmp = pArray[k];
for (j = i - gap; j >= 0 && tmp < pArray[j]; j -= gap)
{
pArray[j + gap] = pArray[j];
k = j;
}
pArray[k] = tmp;
}
} while (gap > 1);
}
int main(int argc, char *argv[])
{
int ret = 0;
int buf[] = { 45, 12, 654, 23, 8932, 9, 532, 213, 987, 3, 5, 546, 354 };
int i = 0;
int len = sizeof(buf) / sizeof(buf[0]);
//从大到小
ShellSort01(buf, len);
//从小到大
//ShellPort02(buf, len);
printBuf(buf, len);
system("pause");
return ret;
}
仔细观看两个函数
一个是插入算法的, 一个是希尔算法的, 是不是很像???
说白了, 就是把插入算法核心函数中所有的 1 全部替换成 gap
[C] 纯文本查看 复制代码 void InsertionSort(int *pArray, int len)
{
int i, j;
int k;
int temp;
if (NULL == pArray || len <= 0)
{
return;
}
for (i = 1; i < len; i++)
{
k = i; //待插入的位置
temp = pArray[k];
for (j = i - 1; (j >= 0) && (pArray[j] > temp); j--)
{
pArray[j + 1] = pArray[j]; //元素后移
k = j; //需要插入的位置
}
pArray[k] = temp; //元素插入
}
void ShellSort01(int *pArray, int len)
{
int i, j, k, tmp;
int gap = len;
do
{
gap = gap / 3 + 1;//分组, 这是效率超过On2的方法
for (i = gap; i < len; i += gap)
{
k = i;
tmp = pArray[k];
// tmp > pArray[j] 这个大于号代表的是数组从大到小还是从小到大
for (j = i - gap; j >= 0 && tmp > pArray[j]; j -= gap)
{
pArray[j + gap] = pArray[j];
k = j;
}
pArray[k] = tmp;
}
} while (gap > 1);
}
}
|