【數據排序】快速排序
阿新 • • 發佈:2019-05-17
就是 ostream int out nbsp oid 順序 等於 mes
//快速排序 from aha #include<iostream> using namespace std; int a[101],n; void print(int a[],int n) { for(int i=1;i<=n;i++) { cout<<a[i]<<" "; } cout<<endl; } void quicksort(int left,int right) { int l,r; l=left,r=right; if(l>r) //呼應後面的判斷,當只剩一個數字的時候會有l>r //一個數字的時候,這個數字是已經歸位了的,所以可以直接退出了。 { return; } int temp; temp=a[left]; //基準數 //從小到大情況下的目的:把基準數復原且將小於基準數的數放在基準數左邊 //大於基準數的數放在基準數的右邊 while(l!=r) //循環的條件是兩個哨兵沒有相遇 //當兩個哨兵相遇了就跳出循環,不再交換值。 { //註意這裏的順序,是先讓右邊的開始找,右邊的找完才能左邊的找//註意基準數是取右邊的那個數字 while(a[r]>=temp&&r>l) //r>l沒有等號的原因:目的就是讓兩個哨兵相遇 //雖然循環條件是r>l,但是如果沒有找到可以交換的數,那麽就會有r=l; //下面的循環l<r,同理 { r--; } while(a[l]<=temp&&l<r) //註意a[l]<=temp,有等於號,一開始a[l]是等於temp的//如果不寫這個等於號 就永遠不會進入這個循環 // 註意這個循環和上一個while循環都有要求<= >=有等於號 { l++; } if(l<r) //如果兩個哨兵沒有相遇,就交換兩個值。 { int t=a[l]; a[l]=a[r],a[r]=t; } } //因為前面會讓l!=r的情況一直循環,所以能運行到這裏的都是l==r的。 //這裏使基準數歸位,就是讓基準數和r==l的那個位置交換值。 a[left]=a[l]; a[l]=temp; //基準值的兩邊分別遞歸 quicksort //不用排序歸位的基準值了,因為他已經歸位了 //所以就newright=l-1或者r-1,現在是l==r的。 //要註意:當最後遞歸到只剩下一個數字的時候,就應該可以退出了。 //所以此時是l==r的,所以將會有 l-1<left,r+1>right的情況 //呼應quicksort開頭那個if(l<r)的時候return. quicksort(left,l-1); quicksort(l+1,right); return; } int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; } quicksort(1,n); //left=1,right=n; print(a,n); return 0; }
【數據排序】快速排序