当前位置: 首页 > news >正文

基础算法(直接插入,希尔排序,快排,归并,折半查找)

/*直接插入:把待排序序列分为有无序区和和无序区,使用无序区的数据一次插入倒有序区中,最终结果尾有序序列

1> 把数据分为有序区和无序区,默认第一个元素在有序区,剩下在无序区

2> 外层循环,循环无序区 的元素 for(i=1;i<n;i++)

3> 内层循环,倒序循环有序区 for(j=i-1;j>=0&&arr[j]>temp;j–)

4> 【升序】有序区元素如果大于插入的元素,后移arr[j+1]=arr[j]

5> 在j+1下标插入temp

时间复杂度:O(n^2)*/

#include<stdio.h>
int main(int argc, const char *argv[])
{int i,j;int arr[7]={4,2,3,1,5,6,7};int n=sizeof(arr)/sizeof(arr[0]);for(i=1;i<n;i++){int temp=arr[i];for(j=i-1;j>=0&&temp<arr[j];j--){arr[j+1]=arr[j];}arr[j+1]=temp;}for(int i=0;i<n;i++){printf("%d\t",arr[i]);}return 0;
}

//希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;

//随着增量逐渐减少,每组包含的越来越多,当增量减至 1 时,整个文件恰被分成一组

//最后都会走到直接插入的地步

//希尔排序时间复杂度低

//时间复杂度:O(n^1.5)

#include<stdio.h>
int main(int argc, const char *argv[])
{int arr[]={4,5,3,1,2,6,7,1};int n=sizeof(arr)/sizeof(arr[0]);int k=n/2;int j;while(k>=1){for(int i=k;i<n;i=i+k){int temp=arr[i];for(j=i-k;j>=0&&temp<arr[j];j=j-k){arr[j+k]=arr[j];}arr[j+k]=temp;}k=k/2;}for(int i=0;i<n;i++){printf("%d\t",arr[i]);}return 0;
}

// 快排n*logn

//、从待排序的序列中,任意选择一个元素作为基准

// 2、将其他元素与基准进行比较,分为大小两个部分

// 3、再对各个部分重新选定基准,并以上述两步重复进行,直到每个部分只剩一个元素为止

#include<stdio.h>
int oneSort(int arr[],int low,int high)
{int key=arr[low];while(low<high){while(low<high&&key<=arr[high]){high--;}arr[low]=arr[high];while(key>=arr[low]&&low<high){low++;}arr[high]=arr[low];}arr[low]=key;return low;
}
void Quick(int arr[],int low,int high)
{//	if(low==high){//		return;//	}
//	if(low>=high){
//		return;
//	}if(low<high){int mid=oneSort(arr,low,high);Quick(arr,low,mid-1);Quick(arr,mid+1,high);}
}int main(int argc, const char *argv[])
{int arr[]={1,2,4,9,6,3,2,1};int len=sizeof(arr)/sizeof(arr[0]);Quick(arr,0,len-1);for(int i;i<len;i++){printf("%d\t",arr[i]);}return 0;
}

二路归并:将待排序序列以中间值mid为界均分为左右两部分,左右两部分继续均分,直到序列中只有一个元## 素为止,逐级将左右两部分有序合并到一个新数组中**

#include<stdio.h>
void combin(int arr[],int low,int high,mid)
{int len=high-low+1;int temp[len];int i=low,j=mid+1,k=0;while(i<mid&&j<=high){if(arr[i]<=arr[j]){temp[k++]=arr[i++]}else{temp[k++]=arr[j++];}}while(i<=mid){temp[k++]=arr[i++];}while(j<=high){temp[k++]=arr[j++];}for(int i=0;i<len;i++){arr[low++]=temp[i++];}
}
void guibing(int arr[],int low,int high)
{if(low>=high){return;}int mid=(low+high)/2;mergersort(arr,low,mid);mergersort(arr,mid+1,high);combin(arr,low,high,mid);
}
int main(int argc, const char *argv[])
{int arr[]={1,2,3,5,9,6,2,1,3};int len=sizeof(arr)/sizeof(arr[0]);mergersort(arr,0,len-1);return 0;
}

查找:给定关键字,查找关键字是否存在

1> 顺序查找O(n)

1.1 存在性查找:查找数据是否存在

1.2 个数查找:查找关键字存在几次

2>折半查找:有顺序的顺序存储

注意:折半查找只能对有序序列进行查找

时间复杂度:O(n/2)**

//存在返回下标,失败返回-1
int halfSearch(int arr[],int low,int high,int key)
{int mid;while(low<=high){mid=(low+high)/2;if(key==arr[mid]){return mid;}else if(key>arr[mid]){low=mid+1;}else{high=mid-1;}}return -1;
}
int main(int argc, const char *argv[])
{/*
mid=(low+high)/287
12,32,45,65,  67,87,89,97
LOW      mid            high67   87    89  97low  mid      high    low=mid+1*/int arr[]={12,32,45,65,67,87,89,97};int len=sizeof(arr)/sizeof(arr[0]);int key;printf("输入查找的值:");scanf("%d",&key);int flag=halfSearch(arr,0,len-1,key);if(flag==-1)printf("%d不存在\n",key);elseprintf("在%d下表出现",flag);return 0;
}//存在返回下标,失败返回-1
http://www.lryc.cn/news/4310.html

相关文章:

  • 电子学会2022年12月青少年软件编程(图形化)等级考试试卷(一级)答案解析
  • 基于JAVA的超级玛丽设计与实现
  • 硬件工程师入门基础知识(一)基础元器件认识(二)
  • Python-项目实战--贪吃蛇小游戏-游戏框架搭建(2)
  • JVM基础
  • Android 内存优化(基础轮)必看~
  • STM32单片机GSM短信自动存取快递柜
  • 力扣(LeetCode)410. 分割数组的最大值(2023.02.12)
  • 管理还原数据
  • c的关键字有那些
  • 链表OJ(一)
  • MySQL第三次作业
  • Python中的类和对象(7)
  • 【JVM】7种经典的垃圾收集器
  • 2023/2/12总结
  • Linux之正则表达式
  • 前端高频面试题-HTML和CSS篇(一)
  • Redis 专题总结
  • 【Python百日进阶-Web开发-Vue3】Day515 - Vue+ts后台项目2:登录页面
  • 【博客620】prometheus如何优化远程读写的性能
  • redis可视工具AnotherRedisDesktopManager的使用
  • 【idea】idea生产类注释和方法注释
  • jenkins +docker+python接口自动化之jenkins容器安装python3(二)
  • go 命令行工具整理
  • RuntimeError: CUDA out of memory
  • Kubernetes1.25中Redis集群部署实例
  • C++11实现计算机网络中的TCP/IP连接(Windows端)
  • Spring框架自定义实现IOC基础功能/IDEA如何手动实现IOC功能
  • pip离线安装windows版torch
  • Redis核心知识点