快速排序、堆排序、希尔排序实现
2012-06-15 15:13
281 查看
#include <cstdio> #include <cstdlib> #include <cmath> void swap(int *a, int *b); void quick_sort(int array[], int low, int heigh); int partion(int array[], int low, int heigh); void init_heap(int array[], int id, int len); void heap_sort(int array[], int len); void insert_sort(int array[], int len, int delta); //delta:增量 void shell_sort(int array[], int len); int main() { int array[] = {5, 9, 1, 4, 8, 6, 2, 3, 7, 0, 13, 17, 12, 15, 14, 16, 11, 10}; //调用快速排序 //quick_sort(array, 0, 17); //调用堆排序 //heap_sort(array, 18); //调用直接插入排序 //insert_sort(array, 18, 1); //调用希尔排序 shell_sort(array, 18); for (int i = 0; i < 18; i++) printf("%d\n", array[i]); system("pause"); return 0; } void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } /***********************************************************************/ //FUNCTION: void quick_sort(int array[], int low, int heigh) { if (low < heigh) { int loc = partion(array, low, heigh); quick_sort(array, low, loc-1); quick_sort(array, loc+1, heigh); } } int partion(int array[], int low, int heigh) { int p = low, q = heigh; int key = array[low]; while (p < q) { while (array[q]>=key && p<q) q--; swap(&array[p], &array[q]); while (array[p]<=key && p<q) p++; swap(&array[p], &array[q]); } return p; } /***********************************************************************/ //FUNCTION:当前结点id,根结点id从0开始编号 void init_heap(int array[], int id, int len) { if (id > len/2-1) //是否存在孩子结点 return; int lchildID = 2*id+1; int maxValueID = lchildID; //保存数值最大的那个结点ID if (lchildID+1 < len && array[lchildID] < array[lchildID+1]) //若存在孩子结点,且右结点值大于左结点值 maxValueID = lchildID+1; if (array[id] < array[maxValueID]) { swap(&array[id], &array[maxValueID]); init_heap(array, maxValueID, len); } } void heap_sort(int array[], int len) { for (int i = len/2-1; i >= 0; i--) init_heap(array, i, len); for (int j = len-1; j > 0; j--) { swap(&array[0], &array[j]); init_heap(array, 0, j); } } /***********************************************************************/ //FUNCTION: void insert_sort(int array[], int len, int delta) { for (int i = 1; i < len; i += delta) { int key = array[i]; int j; for (j = i-delta; j >= 0; j -= delta) { if (key < array[j]) { array[j+delta] = array[j]; array[j] = key; } else break; } } } void shell_sort(int array[], int len) { int delta_len = (int)(logf(len)/logf(2)); int *delta = (int *)malloc(sizeof(int)*delta_len); //增量数组 int tLen = len; for (int i = 0; i < delta_len; i++) { delta[i] = tLen/2; tLen /= 2; } for (int i = 0; i < delta_len; i++) //执行希尔排序 insert_sort(array, len, delta[i]); free(delta); delta = NULL; }
相关文章推荐
- 【程序员笔试面试必会——排序①】Python实现 冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、希尔排序
- java实现七种排序 (插入排序, 希尔排序, 插入排序, 快速排序, 简单选择排序, 堆排序, 归并排序)
- 各类排序算法实现(堆排序、希尔排序、快速排序、归并排序等)
- C++实现直接插入排序,折半插入排序,希尔排序,冒泡排序,简单选择排序,快速排序,堆排序
- C++实现几种常用的时间复杂度为O(nlogn)的排序方法:归并排序、快速排序、堆排序、希尔排序
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- Java实现快速排序、归并排序、堆排序和希尔排序
- 插入排序,希尔排序,堆排序,归并排序,快速排序Java实现
- 常见比较排序算法的实现(归并排序、快速排序、堆排序、选择排序、插入排序、希尔排序)
- 插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序的C++代码实现
- 各种排序算法实现——基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序
- 元素排序几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序——JAVA实现
- 常见排序算法的实现(归并排序、快速排序、堆排序、选择排序、插入排序、希尔排序)
- java实现:快速排序,基数排序,计数排序,归并排序,堆排序,希尔排序
- 冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序java实现
- 插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序——C++实现
- 10种算法原理(冒泡排序,选择排序,快速排序,堆排序,希尔排序,桶排序等)
- java版排序算法简介及冒泡排序以及优化,选择排序,直接插入排序,希尔排序,堆排序,快速排序及其优化前言 2 分类 2 稳定性 3 时间复杂度 4 Java实现版本 5 1、冒泡排序 6 2、选择排序