排序+二分查找
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 }