1.先用快速排序将数组从小到大排好顺序
2.再用插入排序逆转数组
3.再用选择排序将数组恢复
4.再用二分法查找输入两个数之和,找到返回mid 找不到返回-1
代码块
#include <stdio.h>
//封装打印函数
void print_arr(int* arr,int sz){
int i = 0;
int arr1[10];
for(i = 0;i<sz;i++){
arr1[i] = arr[i];
printf("%d ",arr1[i]);
}
}
//划分中枢元素
int partition(int* arr,int low,int high){
int pivot = arr[low];
while(low<high){
while(low<high&&arr[high]>pivot){
high--;
}
arr[low] = arr[high];
while(low<high&&arr[low]<pivot){
low++;
}
arr[high] = arr[low];
if(high == low){
arr[low] = pivot;
}
}
return low;
}
//快速排序从小到大
void Qsort(int* arr,int low,int high){
if(low>high){
return;
}
int mid = partition(arr,low,high);
Qsort(arr,low,mid-1);
Qsort(arr,mid+1,low);
}
//插入一次
void insert(int* arr,int n){
int key = arr[n];
int i = n;
while(arr[i-1]<key){
arr[i] = arr[i-1];
i--;
if(i == 0){
break;
}
}
arr[i] = key;
}
//插入排序逆转数组
void insertsort(int* arr,int sz){
int i = 0;
for(i = 1;i<sz;i++){
insert(arr,i);
}
}
//选择排序逆转回来
int maxelement(int* arr,int n){
int max = arr[0];
int pos = 0;
int i = 0;
for(i = 0;i<n;i++){
if(arr[i]>max){
max = arr[i];
pos = i;
}
}
return pos;
}
void selectsort(int* arr,int sz){
int i = 0;
while(sz>1){
int maxpos = maxelement(arr,sz);
int temp = arr[maxpos];
arr[maxpos] = arr[sz-1];
arr[sz-1] = temp;
sz--;
}
}
//二分法
int search(int* arr,int sz,int value){
int left = 0;
int right = sz-1;
int mid = 0;
int i = 0;
while(left<=right){
mid = (left+right)/2;
if(arr[mid]>value){
right = mid-1;
}else if(arr[mid]<value){
left = mid+1;
}else{
return mid;
}
}
// 这里是未找到的情况
return -1;
}
int main(){
int x;
int y = 0;
int arr[] = {4,5,3,2,1,8,9,7,6,10};
int sz = sizeof(arr)/sizeof(arr[0]);
print_arr(arr,sz);
printf("未排序的数组\n");
// 快速排序
Qsort(arr,0,sz-1);
printf("\n");
print_arr(arr,sz);
printf("快速排序\n");
// 插入排序
insertsort(arr,sz);
printf("\n");
print_arr(arr,sz);
printf("插入排序逆转数组\n");
// 选择排序
printf("\n");
selectsort(arr,sz);
print_arr(arr,sz);
printf("选择排序再次逆转数组\n\n");
// 二分查找返回两个数的下标之和
printf("请输入数组中的两个数\n\n");
scanf("%d%d",&x,&y);
int value = search(arr,sz,x)+search(arr,sz,y);
printf("%d",value);
}
输出结果