首页 > 代码库 > 数据结构——八大排序
数据结构——八大排序
基本结构:
typedef struct array_list { //升级版数组 int length; int* values; } array_list; void swap_values(array_list** ppal, int indexA, int indexB) { //交换升级版数组的指定下标的值 int temp = (*ppal)->values[indexA]; (*ppal)->values[indexA] = (*ppal)->values[indexB]; (*ppal)->values[indexB] = temp; } void init_array_list(array_list** ppal, int length) { //初始化升级版数组 (*ppal) = (array_list*)malloc(sizeof(array_list)); (*ppal)->length = length; (*ppal)->values = (int*)malloc(sizeof(int) * (*ppal)->length); init_values(ppal); } void init_values(array_list** ppal) {//给升级版数组里面的存数的数组赋随机值 int i = 0; for(i = 0; i < (*ppal)->length; i++) { (*ppal)->values[i] = rand(); } }
一、冒泡排序:
void bubble_sort(array_list* pal){ int i=0,j=0; for(i=0;i<pal->length;i++){ for(j=pal->length-1;j>i;j--){ if(pal->values[j] < pal->values[j-1]){ swap_values(&pal,j,j-1); } } } }
二、选择排序:
void selection_sort(array_list* pal){ int i=0,j=0,min=0; for(i=0;i<pal->length;i++){ min = i; for(j=i+1;j<pal->length;j++){ if(pal->values[j] < pal->values[min]){ min = j; } } swap_values(&pal,min,i); } }
三、插入排序:
void insertion_sort(array_list* pal){ int i=0,j=0,temp=0; for(i=1;i<pal->length;i++){ if(pal->values[i] < pal->values[i-1]){ temp = pal->values[i]; for(j=i-1;pal->values[j] > temp;j--){ pal->values[j+1] = pal->values[j]; } pal->values[j+1] = temp; } } }
四、希尔排序:
void shell_sort(array_list* pal) { int i = 0, j = 0, k = 0, increment = 0, temp = 0; for(increment = pal->length / 2; increment > 0; increment /= 2) { for(i = 0; i < increment; i++) { for(j = increment + i; j < pal->length; j += increment) { if(pal->values[j] < pal->values[j - increment]) { temp = pal->values[j]; for(k = j - increment; k >= 0 && pal->values[k] > temp; k -= increment) { pal->values[k + increment] = pal->values[k]; } pal->values[k + increment] = temp; } } } } }
五、堆排序:
注:使用堆排序的时候,待排序的数组的长度要比要排序的数据的个数大1,因为在堆排序中数组的第0个位置没作用,不能用来存数据。
void heap_sort(array_list* pal) { int i = 1; for(i = pal->length / 2; i >= 1; i--) {//注意这里的循环条件。不是i>=0 heap_adjustion(&pal, i, pal->length - 1); } for(i = pal->length - 1; i > 1; i--) {//注意这里的循环条件,不是i>0 swap_values(&pal, 1, i); heap_adjustion(&pal, 1, i - 1); } } void heap_adjustion(array_list** ppal, int start, int end) { int i = 0, temp = 0; temp = (*ppal)->values[start]; for(i = 2 * start; i <= end; i *= 2) { /*注意这里要在i<end的条件下才能判断左子节点和右节节点的关系*/ if(i < end && (*ppal)->values[i] < (*ppal)->values[i + 1])i++; if((*ppal)->values[i] <= temp)break; (*ppal)->values[start] = (*ppal)->values[i]; start = i; } (*ppal)->values[start] = temp; }
六、归并排序:
七、快速排序:
八、基数排序:
数据结构——八大排序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。