C语言排序算法汇总
来源:互联网 发布:上海师范大学网络课程 编辑:程序博客网 时间:2024/05/18 17:23
冒泡排序、插入排序、希尔排序
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;}
后续会更新堆排序以及归并排序等方法。
阅读全文
0 0
- C语言排序算法汇总
- C语言排序算法汇总
- 排序算法大汇总c语言
- C语言各种排序算法汇总
- C语言中常见排序算法汇总
- 各类C语言排序算法汇总--插入排序、快速排序
- 各类C语言排序算法汇总--选择排序
- 各类C语言排序算法汇总--冒泡排序
- 各种内排序算法源码汇总--c语言
- C语言学习_面试加排序算法汇总
- 排序算法汇总(C/C++)
- 经典排序算法汇总(C#)
- C 语言排序算法
- C语言排序算法
- C语言排序算法
- 排序算法(c语言)
- 排序算法 --- C语言
- c语言排序算法
- 汇编语言
- 头条页面
- Socket请求分析
- Binding应用(一)
- c++构建正态分布的随机数
- C语言排序算法汇总
- hdu 4821 字符串hash + map判重
- “非常量引用的初始值必须为左值”问题
- fastsocket试用
- 简单的跑马灯效果
- Eclipse启动加载自定义jdk
- 平面图欧拉公式的精彩证明
- layer 获取页面层(type:1)元素
- JAVA学习线程的初步理解