冒泡排序、插入排序、希尔排序
1、冒泡排序
int BubbleSort(int *data, int length) {
if (data == NULL) {
printf("data is NULL\n");
return -1;
}
int tmp = 0;
for (int i = 0; i < length;i++) {
for (int j = 0; j < length - i - 1;j++) {
if (data[j] > data[j + 1]) {
tmp = data[j];
data[j] = data[j + 1];
data[j + 1] = tmp;
}
}
}
return 0;
}
原理很简单,这里不赘述。
2、插入排序
插入排序:保证前p个数据是有序的,每次向后读一个一个数据到有序序列中进行排序;
例如:5 7 3 6 1 8 9 4 2
- 5 7 3 6 1 8 9 4 2
- 5 3 7 6 1 8 9 4 2
- 3 5 6 7 1 8 9 4 2
- 1 3 5 6 7 8 9 4 2
- 1 3 5 6 7 8 9 4 2
- 1 3 5 6 7 8 9 4 2
- 1 3 4 5 6 7 8 9 2
- 1 2 3 4 5 6 7 8 9
int InsertSort(int *data, int length) {
int tmp = 0;
int i = 0;
int j = 0;
for (i = 1;i < length;i++) {
tmp = data[i];
for (j = i;j > 0 && data[j - 1] > tmp;j--)
data[j] = data[j - 1];
data[j] = tmp;
}
return 0;
}
注意代码中的处理方式可以避免显式的数据交换;例如第7步到第8步的过程:先把2存入tmp;然后数据依次向后移动,直到data[j-1]>tmp;
3、希尔排序
希尔排序是按照增量序列进行排序的;
例如:希尔增量序列:ht = N/2;h(k) = h(k+1)/2;向下取整。
假设有16个数据,N=16;
0 8 ,1 9, 2 10, 3 11,4 12, 5 13, 6 14, 7 15,
0 4, 1 5, 2 6, 3 7, 4 8, 5 9, 6 10, 7 11, 8 12,,,,
0 2, 1 3, 2 4, 3 5, 4 6,,,,,
0 1, 1 2, ,,,,
也可以使用其他增量序列。
int ShellSort(int *data, int length) {
int i = 0;
int j = 0;
int step = length;
int tmp = 0;
for (step = length/2;step > 0;step /= 2) {
for (i = step;i < length;i++) {
tmp = data[i];
for (j = i;j >= step;j -= step) {
if (data[j - step] > tmp) {
data[j] = data[j - step];
}
else
break;
}
data[j] = tmp;
}
}
return 0;
}
4、整体测试代码
#include<stdio.h>
#include<stdlib.h>
int getData(int *data, int length) {
if (data == NULL) {
printf("data is NULL\n");
return -1;
}
for (int i = 0; i < length;i++) {
data[i] = rand() % 1000;
}
return 0;
}
int BubbleSort(int *data, int length) {
if (data == NULL) {
printf("data is NULL\n");
return -1;
}
int tmp = 0;
for (int i = 0; i < length;i++) {
for (int j = 0; j < length - i - 1;j++) {
if (data[j] > data[j + 1]) {
tmp = data[j];
data[j] = data[j + 1];
data[j + 1] = tmp;
}
}
}
return 0;
}
int InsertSort(int *data, int length) {
int tmp = 0;
int i = 0;
int j = 0;
for (i = 1;i < length;i++) {
tmp = data[i];
for (j = i;j > 0 && data[j - 1] > tmp;j--)
data[j] = data[j - 1];
data[j] = tmp;
}
return 0;
}
int ShellSort(int *data, int length) {
int i = 0;
int j = 0;
int step = length;
int tmp = 0;
for (step = length/2;step > 0;step /= 2) {
for (i = step;i < length;i++) {
tmp = data[i];
for (j = i;j >= step;j -= step) {
if (data[j - step] > tmp) {
data[j] = data[j - step];
}
else
break;
}
data[j] = tmp;
}
}
return 0;
}
int checkResult(int *data1, int *data2, int length) {
for (int i = 0;i < length;i++) {
if (data1[i] - data2[i] != 0)
return -1;
}
return 0;
}
int main() {
int length = 1000;
int error = 0;
int* data = (int *)malloc(sizeof(int) * length);
if (data == NULL) {
printf("malloc failed!\n");
return -1;
}
int* bubbleData = (int *)malloc(sizeof(int) * length);
if (bubbleData == NULL) {
printf("malloc failed!\n");
return -1;
}
int* insertData = (int *)malloc(sizeof(int) * length);
if (insertData == NULL) {
printf("malloc failed!\n");
return -1;
}
int* shellData = (int *)malloc(sizeof(int) * length);
if (shellData == NULL) {
printf("malloc failed!\n");
return -1;
}
error = getData(data, length);
if (error != 0) {
printf("get data failed!\n");
return -1;
}
for (int i = 0;i < length;i++) {
bubbleData[i] = data[i];
insertData[i] = data[i];
shellData[i] = data[i];
//printf("%d %d %d\n", data[i], bubbleData[i], insertData[i]);
}
error = BubbleSort(bubbleData, length);
if (error != 0) {
printf("BubbleSort failed!\n");
return -1;
}
error = InsertSort(insertData, length);
if (error != 0) {
printf("InsertSort failed!\n");
return -1;
}
error = ShellSort(shellData, length);
if (error != 0) {
printf("InsertSort failed!\n");
return -1;
}
error = checkResult(shellData, insertData, length);
if (error != 0) {
printf("sort failed!\n");
return -1;
}
printf("sort succeed!\n");
free(data);
free(bubbleData);
free(insertData);
free(shellData);
return 0;
}
后续会更新堆排序以及归并排序等方法。