排序汇总
来源:互联网 发布:c语言大小写转换程序 编辑:程序博客网 时间:2024/06/06 14:59
1.
//排序汇总 #include<stdio.h>#include <time.h>#define arr_len(array) (sizeof(array) / sizeof(array[0]))clock_t start_time, end_time;void swap(int *arr, int i, int j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp;}//1. 输出源数据void print_arr(int *arr, int n){ int len = n; int i = 0; for(i; i < len; i++){ printf("%d ", arr[i]); } printf("\n");} //2. 冒泡排序void bubble_sort(int *arr, int n){ start_time = clock(); int i = 0, j = 0; int len = n; for(i; i < len; i++){ for(j = len - 1; j > 0; j--){ if(arr[j] < arr[j - 1]){ swap(arr, j, j - 1); } } } end_time = clock(); printf("用时: %d ms\n", end_time - start_time);} //3. 选择排序void select_sort(int *arr, int n){ start_time = clock(); int i = 0, j = 0; int min = 0; for(i; i < n; i ++){ min = i; for(j = i + 1; j < n; j++){ if(arr[min] > arr[j]){ min = j; //存放最小值的下标 } } if(i != min){ swap(arr, i, min); } } end_time = clock(); printf("用时: %d ms\n", end_time - start_time);} //4.插入排序void insert_sort(int *arr, int len){ start_time = clock(); int i = 1, j = 0, index = 0, temp = 0; for(i; i < len; i++){ temp = arr[i]; index = i; for(j = i - 1; j >= 0; j--){ if(arr[j] > temp){ arr[j + 1] = arr[j]; index = j; } } arr[index] = temp; } end_time = clock(); printf("用时: %d ms\n", end_time - start_time);} //5. 希尔排序 -- 基于插入排序实现 void shell_sort(int *arr, int len){ start_time = clock(); int i = 1, j = 0, index = 0, temp = 0; int k = len / 2; while(k){ for(i = k; i < len; i++){ temp = arr[i]; index = i; for(j = i - k; j >= 0; j -= k){ if(arr[j] > temp){ arr[j + k] = arr[j]; index = j; } } arr[index] = temp; } k /= 2; } end_time = clock(); printf("用时: %d ms\n", end_time - start_time);} //6. 快排序 -- 基于冒泡排序void quick_sort(int *arr, int low, int high){ start_time = clock(); if(low >= high){ return; } int start = low; int end = high; int key = arr[start]; while(end > start){ //找右半部分小于key的值 while(start < end && arr[end] >= key) { --end; } arr[start] = arr[end]; //找做半部分大于key的值 while(start < end && arr[start] <= key) { ++start; } arr[end] = arr[start]; } arr[start] = key; //起始位置保留: 起始位置是while循环中的位置 quick_sort(arr, low, start - 1); quick_sort(arr, start + 1, high) ; end_time = clock(); printf("用时: %d ms\n", end_time - start_time);} //7. 堆排序 -- 基于选择排序/* 1. 初始化大顶堆 2. 大顶堆和最后一个数据交换后, 在构建 大顶堆 注: 数组的坐标是从0开始的 *///大顶堆void heap_adjust(int arr[], int n, int len) { int max; //记录结点的最大值 下标 while(2 * n + 1 < len){ //是否有左结点 max = 2 * n + 1; if(2 * n + 2 < len) { //有右结点 if(arr[2 * n + 2] > arr[max]){ //右结点是否大于左结点 max += 1; } } if(arr[n] > arr[max]) { //根结点和子树比较 break; } swap(arr, n, max); n = max; //根结点为最大子树 }}//堆排序void heap_sort(int arr[], int len) { //构建一个大顶堆,,从最后一个叶子结点开始 start_time = clock(); int i, j; for(i = len / 2 - 1; i >= 0; i--) { //i = 0; 表示是根结点 heap_adjust(arr, i, len); } for(j = len - 1; j > 0; j--){ //交换的次数, swap(arr, j, 0); //第一结点是最大值, 和最后一个结点交换 heap_adjust(arr, 0, j); //根结点从0开始, 从新构造 } end_time = clock(); printf("用时: %d ms\n", end_time - start_time);}int main(void){ int nums[] = {10,100,1000,10000,30000,50000}; int size = nums[0]; //默认是 10个数据 int m = 0, i = 0, num_len; int arr1[size],arr2[size],arr3[size],arr4[size],arr5[size],arr6[size],arr7[size]; for(m = 0; m < size; m++){ int tmpNum = size - m; arr1[m] = tmpNum; arr2[m] = tmpNum; arr3[m] = tmpNum; arr4[m] = tmpNum; arr5[m] = tmpNum; arr6[m] = tmpNum; } int len = arr_len(arr1); int option = 1; printf(" 1. 输出源数据\n 2. 冒泡排序\n 3. 选择排序\n 4. 插入排序\n 5. 希尔排序\n 6. 快速排序\n 7. 堆排序\n 0. 退出\n"); while(option){ scanf("%d", &option); switch(option){ case 1: print_arr(arr1, len); break; case 2: bubble_sort(arr1, len); print_arr(arr1, len); break; case 3: select_sort(arr2, len); print_arr(arr2, len); break; case 4: insert_sort(arr3, len); print_arr(arr3, len); break; case 5: shell_sort(arr4, len); print_arr(arr4, len); break; case 6: quick_sort(arr5, 0, len - 1); print_arr(arr5, len); break; case 7: heap_sort(arr6, len); print_arr(arr6, len); break; case 0: return 0; break; default: printf(" 1. 输出源数据\n 2. 冒泡排序\n 3. 选择排序\n 4. 插入排序\n 5. 希尔排序\n 6. 快速排序\n 7. 堆排序\n 0. 退出\n"); break; } } return 0;}
注: 在main方法中 int size = nums[0]; 改动nums中的下标,就可以测试大数据了
我的一个同学 总结的还是挺好的 网址是:http://www.cnblogs.com/zyf-zhaoyafei/p/4658333.html
1 0
- 排序汇总
- 排序汇总
- 排序汇总
- 排序汇总
- 排序汇总
- 排序汇总
- 排序汇总
- 排序汇总
- 排序汇总
- 排序算法--排序算法汇总
- 排序算法--排序算法汇总
- 数据汇总加排序
- C#排序大汇总
- 排序算法汇总
- 数据汇总加排序
- 数据汇总加排序
- 数据汇总加排序
- 数据汇总加排序
- ListView+radioButton实现每行单选
- Hadoop生态上几个技术的关系与区别:hive、pig、hbase 关系与区别
- 上下文无关文法2
- LeetCode 240: Search a 2D Matrix II
- 常用类之Date类
- 排序汇总
- 第三天上课
- 【leetcode】Linked List Cycle II
- HDOJ 1022 Train Problem I(栈)
- 斐波那契数列——矩阵的幂求解
- HDU 5327 Olympiad
- iOS KVC 概述
- ScrollView介绍
- SVN Cleanup failed to process the following paths