(C语言)八大排序之:堆排序、快速排序
2018-01-16 23:01
323 查看
堆排序( heap sort ) reference:http://mp.weixin.qq.com/s/mY_bVJPWhzZWL5ZdooA6tw
快速排序( quick sort )
1 /* FILE: heapSort.c 2 * DATE: 20180116 3 * -------------- 4 */ 5 6 #include <stdio.h> 7 8 #define swap(a, b) do{ \ 9 (a) = (a) ^ (b); \ 10 (b) = (b) ^ (a); \ 11 (a) = (a) ^ (b); \ 12 }while(0) 13 14 void heapAdjust(int *array, int parent, int length); 15 void heapSort(int *array, int length); 16 void print(int *array, int length); 17 18 int main(int argc, char *argv[]) 19 { 20 int a[] = {1,3,4,5,2,6,9,7,8,0}; 21 int len = sizeof(a) / sizeof(a[0]); 22 printf("origin: "); 23 print(a, len); 24 heapSort(a, len); 25 printf("heapSort: "); 26 print(a, len); 27 return 0; 28 } 29 30 void heapAdjust(int *array, int parent, int length) 31 { 32 int temp = array[parent]; // 保存当前父节点 33 int child = 2 * parent + 1; // 先获得左孩子 34 while(child < length) 35 { 36 if(child+1<length && array[child]<array[child+1]) 37 child++; 38 // 如果父节点的值已经大于孩子节点的值,则直接结束 39 if(temp >= array[child]) 40 break; 41 // 孩子节点的值赋给父节点 42 array[parent] = array[child]; 43 parent = child; 44 child = 2 * parent + 1; 45 } 46 array[parent] = temp; 47 } 48 49 void heapSort(int *array, int length) 50 { 51 int i; 52 // 循环建立初始堆 53 for(i=length/2; i>=0; i--) 54 { 55 heapAdjust(array, i, length); 56 printf("initialization: "); 57 print(array, length); 58 } 59 // n-1次循环完成排序 60 for(i=length-1; i>0; i--) 61 { 62 // 第一个和最后一个元素交换 63 swap(array[i], array[0]); 64 // 筛选[0]节点,得到i-1个节点的堆 65 heapAdjust(array, 0, i); 66 print(array, length); 67 } 68 } 69 70 void print(int *array, int length) 71 { 72 int i; 73 for(i=0; i<length; i++) 74 printf("%d ", array[i]); 75 printf("\n"); 76 }
快速排序( quick sort )
1 #include <stdio.h> 2 3 #define swap(a, b) do{ \ 4 (a) = (a) ^ (b); \ 5 (b) = (b) ^ (a); \ 6 (a) = (a) ^ (b); \ 7 }while(0) 8 9 void quickSort(int *array, int begin, int end); 10 void print(int *array, int length); 11 12 int main(int argc, char *argv[]) 13 { 14 int a[] = {2,6,9,1,0,25,6}; 15 int len = sizeof(a) / sizeof(a[0]); 16 print(a, len); 17 quickSort(a, 0, len-1); 18 print(a, len); 19 20 return 0; 21 } 22 23 void quickSort(int *array, int begin, int end) 24 { 25 int left = begin; 26 int right = end; 27 int pivot = array[begin]; 28 if(begin >= end) 29 return; 30 while(left < right) 31 { 32 while((left<right) && (array[right] >= pivot)) 33 right--; 34 swap(array[right], array[left]); 35 while((left<right) && (array[left] < pivot)) 36 left++; 37 swap(array[left], array[right]); 38 } 39 array[left] = pivot; 40 quickSort(array, begin, left-1); // 递归 41 quickSort(array, left+1, end); 42 } 43 44 void print(int *array, int length) 45 { 46 int i; 47 for(i=0; i<length; i++) 48 printf("%d ", array[i]); 49 printf("\n"); 50 }
相关文章推荐
- leecode 169. Majority Element(C语言,快速排序,堆排序,各类排序算法复杂度比较)22
- C语言常用排序——直接插入,冒泡,选择,希尔,快速,堆排序
- C语言实现基本排序算法----排序(直接插入排序,SHELL排序,冒泡排序,快速排序,简单选择排序,堆排序)
- C语言实现 排序源程序(包括直接插入、希尔、冒泡、快速、简单选择、堆排序)
- C语言实现 排序源程序(包括直接插入、希尔、冒泡、快速、简单选择、堆排序)
- 八大排序方法汇总(选择排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序、堆排序,归并排序,计数排序)
- c语言 快速排序---归并排序----堆排序
- C语言基本数据结构之五(折半插入,堆排序,冒泡排序,快速排序,并归排序)
- 归并排序,快速排序,堆排序,冒泡排序 c语言源代码
- 归并排序,快速排序,堆排序,冒泡排序 c语言源代码
- C语言:数组排序(插入排序、选择排序、泡排序、谢尔排序、快速排序、堆排序)
- C语言常用的排序方法:冒泡排序,插入排序,快速排序,堆排序,希尔排序
- 选择排序,冒泡排序,归并排序,快速排序,堆排序等等
- 快速排序的C语言代码实现
- c# 自定义排序类(冒泡、选择、插入、希尔、快速、归并、堆排序等)
- 排序算法(插入排序、shell排序、冒泡排序、选择排序、合并排序、堆排序、快速排序、计数排序、基数排序、桶排序)
- 排序方法了解一下(冒泡排序、选择排序、堆排序、插入排序、希尔排序、归并排序、快速排序、基数排序)
- 比较排序总结——直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序
- 排序系列之(2)堆排序及C语言实现
- C语言自带快速排序对比插入排序