快排和二分查找的原理就不說了,網(wǎng)上一搜一大堆,這里主要是自己編寫的快排、二分與系統(tǒng)自帶的快排、二分代碼,一般面試都會出冒泡,所以冒泡是才是最重要的。系統(tǒng)自帶的快排函數(shù)在編寫代碼的時候用著挺方便的,代碼如下:
// 快速排序
#include <stdio.h>
void q_sort(int arr[],int low,int high);
int main()
{
intarr[10] = {0};
inti = 0;
printf("輸入 10 個整數(shù):\n");
for(i= 0;i < 10;i++)
scanf("%d",&arr[i]);
q_sort(arr,0,9);
for(i= 0;i < 10;i++)
printf("%d",arr[i]);
printf("\n");
return0;
}
void q_sort(int arr[],int low,int high)
{
inti = 0,j = 0; //i-低 j-高
intbase = 0; // 基數(shù)
inttemp = 0;
if(low>= high) // 遞歸終止
return;
i= low;
j= high;
base= arr[low];
while(i< j){
while(arr[j]> base)// 高->低
j--;
temp= arr[j];
arr[j]= arr[i];
arr[i]= temp;
while(arr[i]< base)// 低->高
i++;
temp= arr[j];
arr[j]= arr[i];
arr[i]= temp;
if(i<j&& arr[i]==arr[j])
j--;
}
q_sort(arr,low,i-1);
q_sort(arr,i+1,high);
}
/***************************************
auth:肖喬
func:二分查找
***************************************/
#include<stdio.h>
#define N 5
int main(){
inti,j,a[N],t;
inthig,low,mid,k;
printf("請輸入%d個整數(shù):",N);
for(j=0;j<=N-1;j++){
scanf("%d",&a[j]);
}
for(i=0;i<N-1;i++)
for(j=0;j<N-1-i;j++)
if(a[j]>a[j+1]){
t=a[j];a[j]=a[j+1];a[j+1]=t;
}
printf("從小到大排列:");
for(j=0;j<=N-1;j++)
printf("%d",a[j]);
printf("\n");
#if 1
printf("請輸入要查找的數(shù):");
scanf("%d",&k);
low=0;hig=N-1;
while(low<=hig){
mid=(low+hig)/2;
if(a[mid]==k){
printf("%d在數(shù)組中第%d位\n",a[mid],mid+1);
break;
}
elseif(a[mid]<k)
low=mid+1;
else
hig=mid-1;
}
#endif
return0;
}
下面是系統(tǒng)自帶快排和二分查找的函數(shù)。qsort和bsearch兩個函數(shù)可以配合起來用,先排序,在查找,也可以分開使用。qsort在比較兩個數(shù)大小的時候返回3個值,1、-1、0,改變1和-1的位置,就可以實現(xiàn)從大到小和從小到大排序。
qsort
功能:對數(shù)組base中nmemb塊大小為size字節(jié)的數(shù)組快速排序。
參數(shù):base 開始地址,nmenmb 數(shù)據(jù)塊數(shù) size 地址大小 compare 根據(jù)此指針指向的函數(shù)的返回結(jié)果來排序(0,正數(shù)和負(fù)數(shù))
返回值:無
bsearch
功能:從地址base 開始空間的nmenmb塊大小為size字節(jié)的數(shù)據(jù)中,二分查找key指針保存地址空間中的內(nèi)容
參數(shù):key查找內(nèi)容的首地址base開始地址nmenmb
//qsort 函數(shù)的使用
//bseach函數(shù)使用
#include<stdio.h>
#include<stdlib.h>
int c_desc(const void *px,const void *py);
//int c_asc(const void *px,const void *py);
int main(){
intarr[10]={0};
inti=0,j=0,data=0;
int*p=&j;
printf("輸入十個數(shù):");
for(i=0;i<10;i++)
scanf("%d",&arr[i]);
printf("輸入查找的數(shù):");
scanf("%d",&data);
printf("升序排列:\n");
qsort(arr,10,sizeof(int),c_desc);
for(i=0;i<10;i++)
printf("%d",arr[i]);
printf("\n");
// printf("降序排列:\n");
// qsort(arr,10,sizeof(int),c_asc);
// for(i=0;i<10;i++)
// printf("%d",arr[i]);
p=bsearch(&data,arr,10,sizeof(int),c_desc);
if(p==NULL)
printf("不存在");
else{
printf("存在\n");
printf("%d在第%d個位置",data,p-arr+1);
}
printf("\n");
return0;
}
int c_desc(const void *px,const void *py){
const*p1=px;
const*p2=py;
if(*p1==*p2)
return0;
elseif(*p1>*p2)
return1;
else
return-1;
}
#if 0
int c_asc(const void *px,const void *py){
const*p1=px;
const*p2=py;
if(*p1==*p2)
return0;
elseif(*p1>*p2)
return-1;
else
return1;
}
#endif