描述:數組
經過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的全部數據都比另一部分的全部數據都要小,而後再按此方法對這兩部分數據分別進行快速排序,整個排序過程能夠遞歸進行,以此達到整個數據變成有序序列。spa
快速排序 的平均時間複雜度爲O(NlogN),是冒泡排序的一種改進版。code
方法:快速排序主要採用「二分」的思想,步驟以下:blog
以下圖,以數組 6 4 7 1 2爲例:排序
代碼以下:遞歸
#include "stdio.h" void find_frst(int *s,int left,int right) { int i=left,j=right,temp; //(1)初始化i、j if(left>=right) return ; temp=s[i]; //(2)以第一個數組爲比較值,保存到temp中 while(i<j) { while(j>i&&s[j]>=temp) //(3)j--,找小值 j--; s[i]= s[j]; //保存小值,到s[i]上 while(i<j&&s[i]<=temp) //(4)i++,找大值 i++; s[j--]=s[i]; //保存大值 到s[j]上 } s[i]=temp; //(5)將比較值放在s[i]上 /*(6)拆分紅兩個數組 s[0,i-1]、s[i+1,n-1]又開始排序 */ find_frst(s,left,i-1); //左 find_frst(s,i+1,right); //右 } int main() { int i=0,s[100],n; scanf("%d",&n); //輸入數組長度 for(i=0;i<n;i++) scanf("%d",&s[i]); find_frst(s,0,n-1); for(i=0;i<n;i++) printf("%d ",s[i]); //打印 printf("\n"); }
既然有了排序,那麼還有可能用到查找,在有序條件下,固然用二分查找快咯,即簡單又速度快get
代碼以下:it
#include "stdio.h" /*快速排序 */ void find_frst(int *s,int left,int right) { int i=left,j=right,temp; //(1)初始化i、j if(left>=right) return ; temp=s[i]; //(2)以第一個數組爲比較值,保存到temp中 while(i<j) { while(j>i&&s[j]>=temp) //(3)j--,找小值 j--; s[i]= s[j]; //保存小值,到s[i]上 while(i<j&&s[i]<=temp) //(4)i++,找大值 i++; s[j--]=s[i]; //保存大值 到s[j]上 } s[i]=temp; //(5)將比較值放在s[i]上 /*(6)拆分紅兩個數組 s[0,i-1]、s[i+1,n-1]又開始排序 */ find_frst(s,left,i-1); //左 find_frst(s,i+1,right); //右 } /*二分查找 *s[]:數組 size:數組個數 cmp:須要比較的數字 *返回值:表示數組的第幾個,返回-1表示沒有找到 */ int binary_query(const int* s, int size, int cmp) { int low = 0; int high = size-1; int mid; //中間值 while(low<=high) { mid = (low+high)/2; if(s[mid] == cmp) return mid; else if(s[mid] > cmp) high = mid-1; else low = mid+1; } return -1; }
int main() { int i=0,s[100],n,tmp,index; scanf("%d",&n); //輸入:數組長度 for(i=0;i<n;i++) scanf("%d",&s[i]); //輸入:數組數據 find_frst(s,0,n-1); printf("find_frst:\n",s[i]); for(i=0;i<n;i++) printf("%d ",s[i]); //打印:有序數組 printf("\n"); scanf("%d",&tmp); //輸入:要查找的數據 index=binary_query(s,n,tmp); if(index<0) printf("ERR,The value is not querying\n"); else printf("index=%d\n",index); }