專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

快速排序與二分查找程序

作者:劉蕊飛   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年03月02日   【字體:

快排和二分查找的原理就不說了,網(wǎng)上一搜一大堆,這里主要是自己編寫的快排、二分與系統(tǒng)自帶的快排、二分代碼,一般面試都會(huì)出冒泡,所以冒泡是才是最重要的。系統(tǒng)自帶的快排函數(shù)在編寫代碼的時(shí)候用著挺方便的,代碼如下:

 

// 快速排序

 

#include <stdio.h>

 

void q_sort(int arr[],int low,int high);

 

int main()

 

{

 

       intarr[10] = {0};

 

       inti = 0;

 

 

 

       printf("輸入 10 個(gè)整數(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("請(qǐng)輸入%d個(gè)整數(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("請(qǐng)輸入要查找的數(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ù)。qsortbsearch兩個(gè)函數(shù)可以配合起來(lái)用,先排序,在查找,也可以分開使用。qsort在比較兩個(gè)數(shù)大小的時(shí)候返回3個(gè)值,1-1、0,改變1-1的位置,就可以實(shí)現(xiàn)從大到小和從小到大排序。

 

 

 

qsort

 

功能:對(duì)數(shù)組basenmemb塊大小為size字節(jié)的數(shù)組快速排序。

 

參數(shù):base 開始地址,nmenmb 數(shù)據(jù)塊數(shù) size 地址大小 compare 根據(jù)此指針指向的函數(shù)的返回結(jié)果來(lái)排序(0,正數(shù)和負(fù)數(shù))

 

返回值:無(wú)

 

 

 

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("輸入十個(gè)數(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個(gè)位置",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

關(guān)閉窗口

相關(guān)文章