#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define swap(a,b) {typeof(a) t=a; a=b; b=t;}
int order_find(int* arr,size_t len,int key)
{
for(int i=0; i<len; i++)
{
if(arr[i] == key)
return i;
}
return -1;
}
int _binary_find(int* arr,size_t l,size_t r,int key)
{
if(l > r) return -1;
int pi = (l+r)/2;
if(key > arr[pi])
return _binary_find(arr,pi+1,r,key);
else if(key < arr[pi])
return _binary_find(arr,l,pi-1,key);
else return pi;
}
int binary_find(int* arr,size_t len,int key)
{
//return _binary_find(arr,0,len-1,key);
int l = 0 , r = len -1 ;
while(l <= r)
{
int pi = (l+r) / 2;
if(key > arr[pi])
l = pi + 1;
else if(key < arr[pi])
r = pi - 1;
else
return pi;
}
return -1;
}
// 冒泡排序
void bubble_sort(int* arr,size_t len)
{
for(int i=len-1; i>0; i--)
{
bool flag = true;
for(int j=0; j<i; j++)
{
if(arr[j] > arr[j+1])
{
swap(arr[j],arr[j+1]);
flag = false;
}
}
if(flag) break;
}
}
// 插入排序
void insert_sort(int* arr,size_t len)
{
for(int i=1; i<len; i++)
{
int t = arr[i] , k = i;
for(int j=i-1; j>=0 && arr[j] > t; j--)
{
arr[j+1] = arr[j];
k = j;
}
arr[k] = t;
}
}
// 选择排序
void select_sort(int* arr,size_t len)
{
for(int i=len-1; i>0; i--)
{
int max = i;
for(int j=0; j<i; j++)
{
if(arr[j] > arr[max])
max = j;
}
if(max != i)
swap(arr[max],arr[i]);
}
}
void show_arr(int* arr,size_t len)
{
for(int i=0; i<len; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
void _quick_sort(int* arr,size_t left,size_t right)
{
if(left >= right) return;
// 计算标杆的下标
int pi = (left+right)/2;
// 备份标杆的值
int pv = arr[pi];
// 备份左右下标
int l = left , r = right;
/*for(int i=left; i<=right; i++)
{
if(i==pi)
{
printf("[%d] ",arr[i]);
}
else
printf("%d ",arr[i]);
}
printf("\n"); */
// 左右下标相遇时结束
while(l < r)
{
// 在标杆的左边寻找比它大的数据
while(l<pi && arr[l] <= pv) l++;
if(l<pi) // 如果没有超出范围,说明找到比标杆大的值
{
// 与标杆交换位置,并记录新的标杆下标
arr[pi] = arr[l];
pi = l;
}
// 在标杆的右边寻找比它小的数据
while(pi<r && arr[r] >= pv) r--;
if(pi<r) // 如果没有走出范围,说明找到比标杆小的值
{
arr[pi] = arr[r];
pi = r;
}
}
// 还原标杆的值
arr[pi] = pv;
//show_arr(arr,10);
if(pi-left > 1) _quick_sort(arr,left,pi-1);
if(right-pi > 1) _quick_sort(arr,pi+1,right);
}
void quick_sort(int* arr,size_t len)
{
_quick_sort(arr,0,len-1);
}
void creat_heap(int* arr,size_t root,size_t len)
{
if(root >= len) return;
int left = root*2+1,right = root*2+2;
creat_heap(arr,left,len);
creat_heap(arr,right,len);
int max = root;
if(left < len)
{
if(arr[left] > arr[max])
max = left;
}
if(right < len)
{
if(arr[right] > arr[max])
max = right;
}
if(max != root)
swap(arr[max],arr[root]);
}
void heap_sort(int* arr,size_t len)
{
for(int i=0; i<len; i++)
{
creat_heap(arr,0,len-i);
swap(arr[0],arr[len-i-1]);
}
}
void merge(int* arr,size_t left,size_t pi,size_t right)
{
int i=left,j=pi+1,k=0;
// 内部合并
int temp[right-left+1];
while(i<=pi && j<=right)
{
if(arr[i] < arr[j])
temp[k++] = arr[i++];
else
temp[k++] = arr[j++];
}
while(i<=pi) temp[k++] = arr[i++];
while(j<=right) temp[k++] = arr[j++];
for(int i=0; i<=(right-left); i++)
{
arr[i+left] = temp[i];
}
}
void _merge_sort(int* arr,size_t left,size_t right)
{
if(left >= right) return;
int pi = (left+right)/2;
printf("%d %d\n",pi,arr[pi]);
_merge_sort(arr,left,pi);
_merge_sort(arr,pi+1,right);
merge(arr,left,pi,right);
}
void merge_sort(int* arr,size_t len)
{
_merge_sort(arr,0,len-1);
}
int main()
{
int arr[10];
for(int i=0; i<10; i++)
{
arr[i] = rand() % 100;
}
//bubble_sort(arr,1000);
printf("----------------------\n");
insert_sort(arr,10);
show_arr(arr,10);
//select_sort(arr,10);
//quick_sort(arr,10);
//heap_sort(arr,10);
printf("----------------------\n");
show_arr(arr,10);
merge_sort(arr,10);
show_arr(arr,10);
//show_arr(arr,10);
}
各种排序与查找算法
最新推荐文章于 2024-08-13 10:09:24 发布