排序+二分查找

排序+二分查找

1.归并排序
归并排序 核心合并两个有序的数组
开始 sum [] len 将大区间分割成多个小区间 当 begin>=end结束 调动递归函数
将原数组拆分成一个一个的区间
然后执行 merge的操作
开始的数组空间为2
merge(num [],begin end)
{
分成两个区间
需要申请一块临时的空间
两个区间进行大小比较
将比较的结果放入申请的临时的数组空间中
当比较结束后 将申请的临时数组的空间里面的内容 拷贝到原数组中去(循环的放入) num[begin+i]=tmp[i];
最后释放临时的数组空间
}
2.冒泡排序
冒泡排序
两层循环 比较arr[j]和arr[j+1] 相邻两个比较
3.选择排序
选择排序 每一轮选取一个最小的 然后 arr[min] 和 arr[i] 交换
4.插入排序
插入排序 默认第一个元素是有序的将 无序数组依次插入有序数组中 有序数组倒叙插入
5.二分查找(有序数组 时间复杂度为logn)
6.快排
(分治 递归)快排 找标准值 将比标准值小的放在左侧 将比标准值大的放在右侧 然后左右两边重复操作(挖坑填补法)(小区间分割法)
7.堆排序
堆排序 基于完全二叉树的思想 left 2i+1 right 2i+2 0–n/2-1
先创建初始堆
然后交换 堆的顶部 放在最后面或者最前面(大堆 小堆)
调整堆

排序算法的时间复杂度复杂度
在这里插入图片描述
1.归并排序

#include<stdio.h>
#include<stdlib.h>
int res=0;
void merge(int num[],int begin,int end)
{
    
    
    int begin1=begin;
    int end1=begin+(end-begin)/2;
    int begin2=end1+1;
    int end2=end;
    int*temp=(int*)malloc(sizeof(int)*(end-begin+1));
    int i=0;
    while(begin1<=end1&&begin2<=end2)
    {
    
       
        if(num[begin1]<=num[begin2])
        {
    
       
            temp[i]=num[begin1];
            i++;
            begin1++;
        }   
        else
        {
    
       
            temp[i]=num[begin2];
            i++;
            begin2++;
            res=res+end1-begin1+1;
            }   
    }   
    while(begin1<=end1)
    {
    
       
        temp[i]=num[begin1];
        i++;
        begin1++;
    }   
    while(begin2<=end2)
    {
    
       
        temp[i]=num[begin2];
        i++;
        begin2++;
    }   
    //copy  num
    for(int i=0;i<(end-begin)+1;i++)
    {
    
       
        num[begin+i]=temp[i];
 }
    // del
    free(temp);
temp=NULL;

}
void  mergesort(int num[],int nbegin,int nend)
{
    
    
    if(num==NULL||nbegin>=nend) return;
    int mid=nbegin+(nend-nbegin)/2;
    mergesort(num,nbegin,mid);
    mergesort(num,mid+1,nend);
    merge(num,nbegin,nend);

}
int main()
{
    
    
    int num[10]={
    
    10,2,5,13,24,31,23,6,7,58};
    mergesort(num,0,sizeof(num)/sizeof(int)-1);
    for(int i=0;i<10;i++)
    {
    
    
        printf("%d\n",num[i]);
    }
printf("%d\n",res);
    return 0;
}

2.冒泡排序

1 #include<stdio.h>
  2 #include<stdlib.h>
  3 
  4 void bubblesort(int *num,int len)
  5 {
    
    
  6     int  flag=0;
  7     if(num==NULL||len<=1) return ;
  8     for(int i=0;i<len-1;i++)
  9     {
    
    
 10         flag=0;
 11         for(int j=0;j<len-1;j++)
 12         {
    
    
 13             if(num[j]>num[j+1])
 14             {
    
    
 15                 num[j]=num[j]^num[j+1];
 16                 num[j+1]=num[j]^num[j+1];
 17                 num[j]=num[j]^num[j+1];
 18                 flag=1;
 19             }
 20         }
 21 
 22             if(flag==0) break;
 23     }
 24 
 25 }
 26 
 27 int main()
 28 {
    
    
 29     int num[10]={
    
    10,2,5,13,24,31,23,6,7,58};
 30 
 31     bubblesort(num,sizeof(num)/sizeof(num[0]));
 32 
 33     for(int i=0;i<10;i++)
 34     {
    
    
 35         printf("%d\n",num[i]);
 36     }
 37     return 0;
 38 }

3.选择排序

1 #include<stdio.h>
  2 #include<stdlib.h>
  3 
  4 void selectsort(int *num,int len)
  5 {
    
    
  6     int min;
  7     int i;
  8     int j;
  9     for(i=0;i<len-1;i++)
 10     {
    
    
 11             min=i;
 12         for(j=i+1;j<len;j++)
 13         {
    
    
 14            if(num[min]>num[j])
 15            {
    
    
 16                min=j;
 17            }
 18 
 19         }
 20         if(min!=i)
 21         {
    
    
 22           num[min]=num[i]^num[min];
 23           num[i]=num[i]^num[min];
 24           num[min]=num[i]^num[min];
 25         }
 26     }
 27 }
 28 
 29 int main()
 30 {
    
    
 31     int num[10]={
    
    10,2,5,13,24,31,23,6,7,58};
 32 
 33     selectsort(num,sizeof(num)/sizeof(num[0]));
 34 
 35     for(int i=0;i<10;i++)
 36     {
    
    
 37         printf("%d\n",num[i]);
 38     }
 39     return 0;
 40 }

4.插入排序

 1 #include<stdio.h>
  2 #include<stdlib.h>
  3 
  4 void insertsort(int *num,int len)
  5 {
    
    
  6     int j=0;
  7 
  8     for(int i=1;i<len;i++)
  9     {
    
    
 10         j=i-1;
 11         int temp=num[i];
 12         while(temp<num[j]&&j>=0)
 13         {
    
    
 14             num[j+1]=num[j];
 15             j--;
 16         }
 17         num[j+1]=temp;
 18 
 19     }
 20 
 22 }
 23 
 24 int main()
 25 {
    
    
 26     int num[10]={
    
    10,2,5,13,24,31,23,6,7,58};
 27 
 28     insertsort(num,sizeof(num)/sizeof(num[0]));
 29 
 30     for(int i=0;i<10;i++)
 31     {
    
    
 32         printf("%d\n",num[i]);
 33     }
 34     return 0;
 35 }

5.二分查找

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 
  4 int  binarychop(int *arr,int len,int n)
  5 {
    
    
  6     int begin=0;
  7     int end=len-1;
  8     int mid=begin+(end-begin)/2;
  9     while(begin<=end)
 10     {
    
    
 11         if(arr[mid]>n)
 12             end=mid-1;
 13         else if(arr[mid]<n)
 14             begin=mid+1;
 15         else
 16             return mid;
 17 
 18      mid=begin+(end-begin)/2;
 19     }
 20 
 21     return-1;
 22 
 23 }
 24 
 25 int main()
 26 {
    
    
 27     int num[10]={
    
    1,2,3,4,5,6,7,8,9,10};
 28 
 29     int a=binarychop(num,sizeof(num)/sizeof(num[0]),6);
 30     printf("%d\n",a);
 31     for(int i=0;i<10;i++)
 32     {
    
    
 33         printf("%d\n",num[i]);
 34     }
 35     return 0;
 36 }

6.快排

1 #include<stdio.h>
  2 #include<stdlib.h>
  3 //挖坑填補法
  4 int sort2(int *arr,int begin,int end);
  5 int sort(int *arr,int begin,int end)
  6 {
    
       
  7     int temp=arr[begin];
  8     while(begin<end)
  9     {
    
    
 10         while(begin<end)
 11         {
    
    
 12             if(arr[end]<temp)
 13             {
    
    
 14                 arr[begin]=arr[end];
 15                 begin++;
 16                 break;
 17             }
 18             end--;
 19         }
 20         while(begin<end)
 21         {
    
    
 22             if(arr[begin]>temp)
 23             {
    
    
 24                 arr[end]=arr[begin];
 25                 end--;
 26                 break;
 27             }
 28             begin++;
 29         }
 30     }
 31     arr[begin]=temp;
 32     return begin;
 33 
 34 }
 35 void  quicksort(int *arr,int begin,int end)
 36 {
    
    
 37     if(arr==NULL||begin>=end)return ;
 38 
 39     //找標準值
 40     int srtand=sort2(arr,begin,end);
 41     quicksort(arr,begin,srtand-1);
 42     quicksort(arr,srtand+1,end);
 43 }
 44 //區間分割法 小區間擴張法
 45 int sort2(int *arr,int begin,int end)
  int small=begin-1;
 48     for(begin;begin<end;begin++)
 49     {
    
    
 50         if(arr[begin]<arr[end])
 51         {
    
    
 52 
 53             if(++small!=begin)
 54             {
    
    
 55                 arr[small]=arr[small]^arr[begin];
 56                 arr[begin]=arr[small]^arr[begin];
 57                 arr[small]=arr[small]^arr[begin];
 58 
 59             }
 60 
 61         }
 62 
 63     }
 64     if(++small!=end)
 65     {
    
    
 66         arr[small]=arr[small]^arr[end];
 67         arr[end]=arr[small]^arr[end];
 68         arr[small]=arr[small]^arr[end];
 69     }
 70     return small;

7.堆排序

 1 #include<stdio.h>
  2 #include<stdlib.h>
  3 //0 --n-1 左孩子 2i+1 右孩子 2i+2   父親  0--n/2-1 大堆 父親是三個裏面的最大值  小堆 父親是三者裏面的最小值  是一顆完全的二茶樹
  4 //  初始堆 調整父親節點  sort交換堆頂
  5 #define  LEFT 2*rootID+1
  6 #define  RIGHT 2*rootID+2
  7 void  adjust(int *arr ,int len ,int rootID)
  8 {
    
    
  9     //兩個孩子
 10     while(1)
 11     {
    
    
 12         if(RIGHT<len)
 13         {
    
    
 14             if(arr[LEFT]<arr[RIGHT])
 15             {
    
    
 16                 if(arr[RIGHT]>arr[rootID])
 17                 {
    
    
 18                     arr[RIGHT]=arr[RIGHT]^arr[rootID];
 19                     arr[rootID]=arr[RIGHT]^arr[rootID];
 20                     arr[RIGHT]=arr[RIGHT]^arr[rootID];
 21                     rootID=RIGHT;
 22                     continue;
 23                 }
 24                 else
 25                 {
    
    
 26                     break;
 27                 }
 28             }
 29             else
 30             {
    
    
 31                 if(arr[LEFT]>arr[rootID])
 32                 {
    
    
 33                     arr[LEFT]=arr[LEFT]^arr[rootID];
 34                     arr[rootID]=arr[LEFT]^arr[rootID];
 35                     arr[LEFT]=arr[LEFT]^arr[rootID];
 36                     rootID=LEFT;
 37                     continue;
 38                 }
 39                 else
 40                 {
    
    
 41                     break;
 42                 }
 43             }
 45         }
 else if(LEFT<len)
 47         {
    
    
 48             if(arr[LEFT]>arr[rootID])
 49             {
    
    
 50                 arr[LEFT]=arr[LEFT]^arr[rootID];
 51                 arr[rootID]=arr[LEFT]^arr[rootID];
 52                 arr[LEFT]=arr[LEFT]^arr[rootID];
 53                 rootID=LEFT;
 54                 continue;
 55             }
 56             else
 57             {
    
    
 58                 break;
 59 
 60             }
 61         }
 62         else
 63         {
    
    
 64             break;
 65         }
 66     }
 67 
 68 }
 69 
 70 
 71 void heapsort(int* arr,int len)
 72 {
    
    
 73 
 74     if(arr==NULL||len<=0) return ;
 75     //構建初始堆
 76     int n=len/2-1;
 77     for(n;n>=0;n--)
 78     {
    
    
 79         // 調整各個堆頂
 80         adjust(arr,len,n);
 81     }
 82     //交換
 83 
 84     for(int i=len-1;i>0;i--)
 85     {
    
    
  86     arr[0]=arr[0]^arr[i];
 87     arr[i]=arr[0]^arr[i];
 88     arr[0]=arr[0]^arr[i];
 89     adjust(arr,i,0);
 90     }
 91 }
 92 
 93 int main()
 94 {
    
    
 95     int num[10]={
    
    1,2,3,4,7,6,7,8,9,10};
 96 
 97     heapsort(num,sizeof(num)/sizeof(num[0]));
 98     for(int i=0;i<10;i++)
 99     {
    
    
100         printf("%d\n",num[i]);
101     }
102     return 0;
103 }

猜你喜欢

转载自blog.csdn.net/m0_46717588/article/details/116672532
今日推荐