C/C++快速排序
//左邊區(qū)間比key小,中間區(qū)間未處理,右邊區(qū)間比key大
int oneSort(int a[],int left,int right)
{//i,j為兩個指針,一個從左向右移動,一個從右向左移動int i=left;int j=right;int key=a[left]; //把第一個數(shù)當(dāng)軸值while(i<j)//每次循環(huán)處理左右兩個子區(qū)間,并完成左右區(qū)間第一個不滿足值的位置交換{while(key<a[j]&&i<j) //如果右邊的值比軸值大,指針向左移動j--;if(i<j){ a[i]=a[j];//右邊第一個比key小的值放在左邊指針停留的位置i++;//左邊指針向右移動一位,下次指針移動從下一個位置開始}while(a[i]<key&&i<j) //如果左邊的值比軸值小,指針向右移動i++;if(i<j){a[j]=a[i];//左邊第一個比key大的值放在右邊指針停留的位置j--;//右邊指針向左移動一位,下次指針移動從下一個位置開始}}//至此,[left,i]左邊區(qū)間值都比key小,[j,right]右邊區(qū)間值都比key大,完成時i==ja[i]=key; //設(shè)置key的位置,i指針停留的位置就是key的位置,實際上就是交換key,i,j的值//key=a[j];右邊第一個比key小的值放在key位置//a[j]=a[i];左邊第一個比key大的值放在右邊第一個比key小的位置//a[i]=key;key放在左邊第一個比key大的位置return i; //返回key的位置
}
void qSort(int a[],int left,int right)
{if(left<right){int key_pos=oneSort(a,left,right); //完成一次劃分,并返回key的坐標(biāo)qSort(a,left,key_pos-1);//繼續(xù)劃分左邊qSort(a,key_pos+1,right);//繼續(xù)劃分右邊}
}int _tmain(int argc, _TCHAR* argv[])
{int a[10] = {7,3,8,9,4,1,10,5,2,6};cout<<"before sort:";for (int i=0;i<10;i++){cout<<a[i]<<" ";}cout<<endl;qSort(a,0,9);cout<<"after sort:";for (int i=0;i<10;i++){cout<<a[i]<<" ";}cout<<endl;getchar();return 0;
}
總結(jié)
- 上一篇: 谈谈tcp/ip协议
- 下一篇: windows平台一个高性能、通用型的C