• 数据结构:排序算法+查找算法


    一、概念

    程序=数据结构+算法

    1.算法的特性和要求

    特性:

    确定性(每次运行相同的输入都是同样的结果)、有穷性、输入、输出、可行性

    设计要求:

    正确性、高效率、低存储、健壮性、可读性

    2.时间复杂度

    3.常见排序算法的时间复杂度

    冒泡排序:O(n^2)

    选择排序:O(n^2)

    快速排序:O(nlog2n)

    直接插入排序:最坏情况O(n^2),最好情况O(n)

    二、排序代码

    1.冒泡排序

    1. int len=sizeof(arr)/sizeof(arr[0]);
    2. for(int i=1;i
    3. {
    4. for(int j=0;j
    5. {
    6. if(arr[j]>arr[j+1])
    7. {
    8. temp = arr[j];
    9. arr[j] = arr[j+1];
    10. arr[j+1] = temp;
    11. }
    12. }
    13. }

    2.选择排序

    1. 已知min_index,长度len
    2. for(int i=1;i)
    3. {
    4. min_index = i-1; //假定最小值是待排序序列中的第一个元素
    5. for(int j=i;j
    6. {
    7. if(arr[min_index]>arr[j])
    8. {
    9. min_index = j;
    10. }
    11. }
    12. temp = arr[min_index];
    13. arr[min_index] = arr[i-1];
    14. arr[i-1] = temp;
    15. }

    3.快速排序

    1. #include
    2. #include
    3. //定义一次快排的函数,返回最后基准的位置
    4. int one_sort(int *arr,int low,int high){
    5. int base=arr[low];
    6. //只要high大于low说明没排好序
    7. while(low
    8. while(low=base){//当high>low并且high位置元素大于基准时high前移
    9. high--;
    10. }
    11. arr[low]=arr[high];//用high下标的元素覆盖掉low下标的元素
    12. //当high>low并且low下标元素小于base时,low后移
    13. while(lowbase){
    14. low++;
    15. }
    16. arr[high]=arr[low];
    17. }
    18. arr[low]=base;
    19. return low;
    20. }
    21. void sort(int *arr,int low,int high){
    22. //传过来的low
    23. if(low
    24. int ret =one_sort(arr,low,high);//接收一次快排后中间位置(基准)
    25. sort(arr,low,ret-1);
    26. sort(arr,ret+1,high);
    27. }
    28. }
    29. int main(int argc, const char *argv[])
    30. {
    31. int arr[]={12,90,78,23,1,10,56,11};
    32. int len=sizeof(arr)/sizeof(int);
    33. sort(arr,0,len-1);
    34. for(int i=0;i
    35. printf("%d ",arr[i]);
    36. }
    37. putchar(10);
    38. return 0;
    39. }

    4.直接插入排序

    1. #include
    2. #include
    3. void insert_sort(int *arr,int len){
    4. int i,j,temp;
    5. //循环插入元素进入待排序序列中
    6. for(i=1;i//从第二个元素开始
    7. temp=arr[i]; //把要插入的元素保存一下
    8. for(j=i;j>0 && temp-1];j--){ //用前面的每一个元素与待插入的元素比较
    9. arr[j]=arr[j-1]; //把前面的元素后移
    10. }
    11. //退出了内层循环,说明找到了要插入的位置、
    12. arr[j]=temp; //把要插入的元素插入
    13. }
    14. }
    15. int main(int argc, const char *argv[])
    16. {
    17. int arr[]={12,90,78,23,1,10};
    18. int len=sizeof(arr)/sizeof(arr[1]);
    19. insert_sort(arr,len);
    20. for(int i=0;i
    21. printf("%d ",arr[i]);
    22. }
    23. putchar(10);
    24. return 0;
    25. }

     三、查找算法代码

    1.折半查找

    折半查找的前提:对有序序列进行查找

    1. #include
    2. #include
    3. int half_search(int *arr,int low,int high,int key){
    4. //如果传过来的最大值下标大于最小值的下标
    5. while(low<=high){
    6. //找中间值
    7. int mid=(low+high)/2;//得到中间值的下标;
    8. if(arr[mid]==key){
    9. printf("查找成功\n");
    10. return mid;
    11. }
    12. if(key
    13. high=mid-1;
    14. else if(key>arr[mid])
    15. low=mid+1;
    16. }
    17. return 0;
    18. }
    19. int main(int argc, const char *argv[])
    20. {
    21. int arr[]={11,12,13,23,59,78,100};
    22. int len=sizeof(arr)/sizeof(arr[1]);
    23. printf("%d\n",half_search(arr,0,len-1,99));
    24. return 0;
    25. }

    2.哈希排序

    哈希表的构造方法:

    除留余数法:关键字对指定数据取模后,得到的就是关键字在哈希表中的下标

    取模的数:关键字个数除3/4 ===>关键字个数*4/3 取最大质数

    hash.c

    1. #include "hash.h"
    2. //创建结点的函数
    3. node_p create_node(int data)
    4. {
    5. node_p new=(node_p)malloc(sizeof(node));
    6. if(new==NULL){
    7. printf("申请失败\n");
    8. return NULL;
    9. }
    10. new->data=data;
    11. new->next=NULL;
    12. return new;
    13. }
    14. //存储函数
    15. void save_hash(node_p hash[],int key)
    16. {
    17. int base=key%MAX;//除留余数法
    18. node_p new=create_node(key);//申请新节点,把新节点存入哈希表
    19. //把新节点存入哈希表
    20. new->next=hash[base];
    21. hash[base]=new; //让结构体指针指向新节点
    22. //hash[base]中存的是第一个元素的地址
    23. }
    24. //打印函数
    25. void show_hash(node_p hash[]){
    26. //循环结构体指针数组,即hash表
    27. for(int i=0;i
    28. //循环链表
    29. node_p p=hash[i];
    30. while(p!=NULL){
    31. printf("%d->",p->data);
    32. p=p->next;
    33. }
    34. printf("^\n");
    35. }
    36. }
    37. //查找
    38. void search_hash(node_p hash[],int key){
    39. /* //法一:
    40. //直接取到关键对13取模的结果
    41. int base=key%MAX;
    42. int i=1;
    43. //准备遍历整条链表
    44. node_p p=hash[base];
    45. //如果找到的关键字不符并且节点存在
    46. // while(p->data!=NULL && p!=NULL){
    47. while(p!=NULL){
    48. if(p->data==key){
    49. printf("查找成功,数据在哈希表的%d位置\n",i);
    50. break;
    51. }
    52. i++;
    53. p=p->next;
    54. }
    55. if(p==NULL)
    56. printf("查找失败\n");
    57. }
    58. */
    59. //法二:
    60. int i;
    61. for(i=0;i
    62. node_p p=hash[i];
    63. while(p!=NULL){
    64. if(p->data==key){
    65. printf("查找成功\n");
    66. return;
    67. }
    68. p=p->next;
    69. }
    70. }
    71. if(i==MAX)
    72. printf("查找失败\n");
    73. }

    hash.h

    1. #ifndef __HASH_H__
    2. #define __HASH_H__
    3. #include
    4. #include
    5. #define MAX 13
    6. typedef struct node{
    7. int data;
    8. struct node *next;
    9. }node,*node_p;
    10. //创建结点的函数
    11. node_p create_node(int data);
    12. //存储函数
    13. void save_hash(node_p hash[],int key);
    14. //打印函数
    15. void show_hash(node_p hash[]);
    16. //查找
    17. void search_hash(node_p hash[],int key);
    18. #endif

    main.c

    1. #include "hash.h"
    2. int main(){
    3. int arr[]={25,51,8,22,26,67,11,16,54,41};
    4. int len=sizeof(arr)/sizeof(arr[1]);
    5. //申请一个结构体指针,里面存的是地址
    6. node_p hash[13]={0};//初始时指针都指向NULL
    7. for(int i=0;i
    8. save_hash(hash,arr[i]);
    9. }
    10. //show_hash(hash);
    11. search_hash(hash,11);
    12. }

  • 相关阅读:
    Oracle 常用简单sql操作
    java-php-python-会议查询系统计算机毕业设计
    Linux高级I/O:非阻塞IO fcntl | 多路转接之select | poll
    MySQL基础三问:底层逻辑、正在执行、日志观察
    习练真气运行法必须从调整呼吸入手
    数据分析_数据分析思维(1)
    【pip command】之 options 汇总
    spdlog日志库的封装使用
    ReentrantLock讲解
    2023年度中国开源研究报告
  • 原文地址:https://blog.csdn.net/weixin_50022690/article/details/136353724