• 冒泡排序
  • 选择排序
  • 插入排序
    总结记录下,好记性不如烂笔头

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define IN
#define OUT
#define INOUT#define JakeDebug(format,args...)do{ fprintf(stderr,"%s %s %d:"format"\n",__FILE__,__FUNCTION__,__LINE__,##args); }while(0);int ExchangeTwoIntData(INOUT int* pData1,INOUT int* pData2)
{if(pData1 == NULL || pData2 == NULL){JakeDebug(" Two Pointers must is legel")return -1;}int iCacheData = *pData1;*pData1 = *pData2;*pData2 = iCacheData;return 1;
}int PrintIntArr(IN int*pData,IN int iNumber)
{int i = 0;for (i = 0; i < iNumber; ++i){printf("%d\t",pData[i]);}printf("\n");}
/*** * @description: * 冒泡排序思路整理:冒泡排序的本质是两两数据比对交换* 我们要这样去想:* 全部两两交换完是一趟.* 而不是将冒泡排序理解成拿一个数组的某个和数组一个个比对,这样想是错误的,编写出来的代码不具有通用性。* 理解成趟:那么我们只需要比对n-1趟.* 第一个循环为什么减去1?这里就是n-1趟了,n-1趟我们按最大或者最小的冒泡生成了n-1个有序数据,最后一个必定是有序的* 第二个循环为什减去i,减去1? 减去i是因为我们每次便利一趟就会冒出一个有序数据,遍历i趟生成i个有序数据,有序数据不需要* 参加比对。那么减去1呢?减去1是因为我们是两两比对,每趟,我们用j和j+1比对,我们要预留出第二个数据的位置,防止越界.* * 优化:* 外层循环优化* 如果第一趟两两比对没有产生交换,那么这个数组就是有序的* * 内层循环优化* 我们把数据看成有序区 和无序区* 怎么分界?在循环中最后一次交换的位置就是分界* 这种优化是为了解决 在一开始,数据后面的部分数据就已经是有序的了* @param {INOUT int*} pData* @param {IN int} iNumber* @return {*}*/
int BubbleSort(INOUT int* pData,IN int iNumber)
{if(pData == NULL || iNumber < 2){printf("Input error");return -1;}int i = 0,j = 0;int iflag = 0;int k = iNumber-1;int pos = 0; for(i = 0; i < iNumber-1;i++){iflag = 0;for(j = 0;j < k;j++){if(pData[j] > pData[j+1]){ExchangeTwoIntData(&pData[j],&pData[j+1]);}iflag = 1;pos = j;}k = pos;if(iflag == 0){printf("data was ordered\n");return 1;}}return 1;
}/*** @description: * 基本思路:我们默认一个位置的值是最小的,然后遍历一次获取一个最小值的位置,和当前的值进行交换* 我们需要遍历n-1趟,没次一个最小值的位置被找出并交换,最后一个必定是有序的* 我们遍历的起始位置是和第几趟有关系的,没完成一趟有序区增加一个,那么我们默认趟数从0开始,那么我们有序的最后位置恰好等于i* 所以j=i+1:* 那么会什么加一?因为i和j相同时是指向同一个位置,不需要比对* * 优化:* 外圈优化,如果遍历完成一遍后的位置是相同的,则不需要进行交换* @param {INOUT int*} pData* @param {IN int} iNumber* @return {*}*/
int SelectSort(INOUT int* pData,IN int iNumber)
{if(pData == NULL || iNumber < 2){printf("Input error\n");return -1;}int i = 0, j = 0;int iMinPos = 0;for (i = 0; i < iNumber - 1; i++)//趟数{iMinPos = i;for(j = i+1; j < iNumber; ++j){if(pData[j] < pData[iMinPos]){iMinPos = j;}}if(i != iMinPos){ExchangeTwoIntData(&pData[i],&pData[iMinPos]);}}return 1;}/*** @description: * 基本思路:默认有序区,向有序区插入数据* 类比:打牌,拿到牌插入到正确位置* 代码思路:变量存储默认的有序区边界,* 变量缓存当前拿到的无序数据。while循环判断有序边界的值和无序数据大小不能为0* true:将有序边界向后移动一位,并将有序位置减去-,这样就完成了有序区的向后移动* 此时,我们拿到的有序数据位置已经被占据了,我们先见之明已经缓存了大小。* * 循环结束,有序边界变量此时代表的就是要插入位置的前一个,因为最后一次执行了一次减减操作* 所以要加一后再将缓存的数据赋值到该位置* @param {INOUT int*} pData* @param {IN int} iNumber* @return {*}*/
int InsertSort(INOUT int* pData,IN int iNumber)
{if(pData == NULL || iNumber < 2){printf("Input error\n");return -1;}int i = 0;int iOrderEndPos = 0;int iCahedata = 0;for ( i = 1; i < iNumber; i++){iOrderEndPos = i - 1;iCahedata = pData[i];while(iCahedata < pData[iOrderEndPos] && iOrderEndPos >= 0){ExchangeTwoIntData(&pData[iOrderEndPos+1],&pData[iOrderEndPos]);iOrderEndPos--;}pData[iOrderEndPos+1] = iCahedata; }
}int main(int argc,char *argv[])
{int iTestArr[] = {9,3,4,5,6,7,2,8,1,100};JakeDebug("Original data:");PrintIntArr(iTestArr,sizeof(iTestArr)/sizeof(iTestArr[0]));
//-------------------------sort function------------------------------------------//LOW B 三人组// BubbleSort(iTestArr,sizeof(iTestArr)/sizeof(iTestArr[0]));// SelectSort(iTestArr,sizeof(iTestArr)/sizeof(iTestArr[0]));// InsertSort(iTestArr,sizeof(iTestArr)/sizeof(iTestArr[0]));//--------------------------------------------------------------------------------JakeDebug("Data after sort:");PrintIntArr(iTestArr,sizeof(iTestArr)/sizeof(iTestArr[0]));
}

排序算法lowB三人组相关推荐

  1. 排序算法lowb三人组-插入排序

    排序算法lowb三人组-插入排序 def insert_sort(li):for i in range(1, len(li)): # i表示摸到的牌的下标tmp = li[i] # 摸到的牌j = i ...

  2. 算法-lowb三人组

    ---恢复内容开始--- d定义: pandas是一个强大的Python数据分析的工具包. pandas是基于NumPy构建的. 安装方法: pip install pandas import pan ...

  3. [ 数据结构 -- 手撕排序算法第三篇 ] 希尔排序

    手撕排序算法系列之:希尔排序. 从本篇文章开始,我会介绍并分析常见的几种排序,大致包括插入排序,冒泡排序,希尔排序,选择排序,堆排序,快速排序,归并排序等. 大家可以点击此链接阅读其他排序算法:排序算 ...

  4. 9个元素换6次达到排序序列_一文带你读懂排序算法(三):堆排序算法

    国庆节快乐~点击上方文字关注我们哦 堆是一种特殊的树形数据结构,其每一个结点都有一个值,通常提到的堆都是指一棵完全二叉树,根结点的值小于(或大于)两个子结点的值,同时,根结点的两个子树也分别是一个堆. ...

  5. java 实现 常见排序算法(三)快速排序

    大家好,我是烤鸭: 今天分享一下基础排序算法之快速排序.快速排序是内部排序(基于比较排序)中最好的比较算法. 1.     快速排序: 原理:在要排的数(比如数组A)中选择一个中心值key(比如A[0 ...

  6. 图解排序算法(三)之堆排序

    预备知识 堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序.首先简单了解下堆结构. 堆 堆是具有以下性 ...

  7. 排序算法(三)—— 插入法排序算法

    1.插入法排序算法介绍 插入法是一个比较常用的排序方法.插入法排序的思路就是将要排序的数组分两个区间,一个是已排序区间,一个是未排序区间.初始时,默认第一个元素是已排序区间的,后面的所有元素为未排序区 ...

  8. 【排序算法(三)】直接插入排序及其改进

    基本思想 直接插入排序是一种简单且有效的比较排序算法,在每次迭代过程中选取未排序序列的第一个元素,并将该元素插入左侧已排序序列的正确位置,重复该过程,直到所有输入元素都被选择一次. 对于数组 {3, ...

  9. 算法1-排序LowB三人组

    import random from timewrap import *@cal_time def bubble_sort(li):for i in range(len(li) - 1):# i 表示 ...

  10. 排序算法第三篇——归并排序

    算法描述: 归并(Merge)排序是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 对一个数组进行归并排序主 ...

最新文章

  1. Matlab中去除exe执行时文件的DOS窗口的方法
  2. 【Qt】Qt样式表总结(三):QObject 属性
  3. 【转载】设置Windows中gvim的默认配色方案和字体
  4. 网络推广外包——竞价账户网络推广外包时怎样进行关键词推广?
  5. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库到 Android Studio 工程 | 配置 build.gradle 构建脚本 )
  6. java 具有绘图能力的类,《Java程序设计》复习题_绘图
  7. 全球及中国二乙氨基羟基苯甲酰基苯甲酸己酯行业规模分析与市场需求预测报告2022版
  8. [你必须知道的.NET]第二十四回:认识元数据和IL(上)
  9. 微服务技术发展的现状与展望
  10. SpringBoot之AOP之基本使用
  11. Vmware中RedHat命令行和图形界面切换
  12. JAVA模板模式,简历模板(例子)
  13. 微信小程序——全国城市列表
  14. java 数据库基础_数据库基础知识考试及答案 PDF 下载
  15. python核心编程电子书_Python核心编程 PDF 超清第3版
  16. 【ELT.ZIP】OpenHarmony啃论文俱乐部—一种深度神经网压缩算法
  17. stm32 步进电机控制,S曲线加减速,匀加速运动
  18. C语言--斐波那契数列(三种方法)
  19. 世界有时特别吝啬【摘自《青年文摘》】
  20. mac MAMP使用

热门文章

  1. 有缓震功能的舒缓拖鞋能给运动后带来什么样的减压效果?
  2. 如何修改PDF,怎么给PDF加页码
  3. PTA 求链式线性表的倒数第K项 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。
  4. 用html实现彩虹动画
  5. 简化sqp唯一数据的逻辑
  6. 完美解决网页中Flash狂闪的问题
  7. 线性代数的那些事(二)行列式与逆
  8. 中国风android,小鱼天气 - 水墨古典中国风 #Android
  9. 网站建设的方案和流程介绍
  10. kafak集群python外网无法访问:kafka.errors.NoBrokersAvailable: NoBrokersAvailable