标签:inf 使用 没有 情况 代码 实现 void 循环 为什么
//1.算法的描述 2.算法的实现 3.效率(时间复杂度和空间复杂度和稳定性)
//稳定性定义:如果两个关键值A和A`,如果一开始A就在A`前面,你排序后A还在A`前面,我们就认为
是稳定的
//怎么看稳定性:看有没有跳跃交换
//第一种排序算法:直接插入排序:如果数组基本有序,我们就用直接插入排序,越有序,时间复杂度
越小,极端情况下为O(n)
//时间复杂度O(n^2) 空间复杂度O(1) ,稳定的
//为什么不用从前向后找:如果数组有序,则时间复杂度太大
#include <stdio.h> #include <assert.h> void InsertSort(int arr[], int len) { //循环多少次 个数-1 //用临时量tmp保存关键值,从后向前找,比它小的或者走到了头,就将关键值放到下一个位置上 assert(arr != NULL); if (NULL == arr) return; int count = 0; int tmp = 0; int j = 0; for (int i = 1; i < len; i++)//控制揭牌后需要排序的次数 { tmp = arr[i]; for (j = i - 1; j >= 0; j--)//从后向前找 { if (arr[j] > tmp)//比关键值大,则向后移动 { arr[j + 1] = arr[j]; count++; } else { break;//找到了比它小的值 退出 } } arr[j + 1] = tmp; } printf("count %d\n", count); } void Show(int* arr, int len) { assert(arr != NULL); if (NULL == arr) return; for (int i = 0; i < len; i++) { printf("%d ", arr[i]); } printf("\n"); } int main() { int arr[] = { 2,4,6,8,23,98,76,56,74,36,1,3,5,7,99,66,77,88 }; InsertSort(arr, sizeof(arr) / sizeof(arr[0])); Show(arr, sizeof(arr) / sizeof(arr[0])); return 0; }
#include <stdio.h> #include <assert.h> static void Shell(int arr[], int len, int gap)//gap 分成多少组(间隔) { int tmp = 0; int j = 0; int count = 0; for (int i = gap; i < len; i++)//i开始的位置 { tmp = arr[i]; for (j = i - gap; j >= 0; j = j - gap) { if (arr[j] > tmp) { arr[j + gap] = arr[j]; count++; } else { break; } } arr[j + gap] = tmp; } printf("%d count %d\n", gap, count); } void ShellSort(int arr[], int len) { assert(arr != nullptr); if (NULL == arr) return; int dk[] = { 5, 3, 1 }; for (int i = 0; i < sizeof(dk) / sizeof(dk[0]); i++) { Shell(arr, len, dk[i]); } } void Show(int* arr, int len) { assert(arr != NULL); if (NULL == arr) return; for (int i = 0; i < len; i++) { printf("%d ", arr[i]); } printf("\n"); } int main() { int arr2[] = { 2,4,6,8,23,98,76,56,74,36,1,3,5,7,99,66,77,88 }; ShellSort(arr2, sizeof(arr2) / sizeof(arr2[0])); Show(arr2, sizeof(arr2) / sizeof(arr2[0])); return 0; }
标签:inf 使用 没有 情况 代码 实现 void 循环 为什么
原文地址:https://www.cnblogs.com/xpei-1124/p/14786322.html