基礎演算法--排序:之快速排序
阿新 • • 發佈:2018-11-12
與簡單排序不同,快序排序所需的比較次數較少,是內部排序中速度較快的一種排序方法。
演算法思想: 分-------------- 將待排序集合劃分為2部分 (一部分小於準則值,一部分大於等於準則值)
這個分的過程是不斷迭代的,直到無法再分為止。
演算法過程演示:
一趟排序所使用的演算法:
示例:
示例:
演算法:
演算法分析:
程式程式碼:
形式1:
[cpp] view plaincopy
- void QuickSort(int R[], int low,int high)
- {
- int i,j;
- int pivot;
- i=low;
- j=high;
- pivot=R[i];
- do
- {
- while((R[j]>=pivot)&&(i<j)) j--;
- if(i<j) R[i++]=R[j];
- while(R[i]<pivot&&(i<j)) i++;
- if(i<j) R[j--]=R[i];
- } while (i!=j);
- R[i]=pivot;
- if(low<i-1) QuickSort(R,low,i-1);
- if(high>i+1) QuickSort(R,i+1,high);
- }
形式1---優化1:(如何確定基準值)
[cpp] view plaincopy
- void QuickSort(int R[], int low,int high)
- {
- int i,j;
- int pivot;
- int & iLeft=R[low];
- int & iRight=R[high];
- int & iMiddle=R[(low+high)/2];
- // 目的為了使 準則值R[low] 為這三個值的中間值
- int temp;
- if (iLeft>iMiddle)
- {
- temp=iMiddle;
- iMiddle=iLeft;
- iLeft=temp;
- }
- if (iRight>iMiddle)
- {
- temp=iMiddle;
- iMiddle=iRight;
- iRight=temp;
- }
- if (iLeft<iRight)
- {
- temp=iRight;
- iRight=iLeft;
- iLeft=iRight;
- }
- i=low;
- j=high;
- pivot=R[i];
- do
- {
- while((R[j]>=pivot)&&(i<j)) j--;
- if(i<j) R[i++]=R[j];
- while(R[i]<pivot&&(i<j)) i++;
- if(i<j) R[j--]=R[i];
- } while (i!=j);
- R[i]=pivot;
- if(low<i-1) QuickSort(R,low,i-1);
- if(high>i+1) QuickSort(R,i+1,high);
- }
形式1----優化2 (元素個數小於30時,採用選擇排序)
[cpp] view plaincopy
- void QuickSort(int R[], int low,int high)
- {
- int i,j;
- int pivot;
- int & iLeft=R[low];
- int & iRight=R[high];
- int & iMiddle=R[(low+high)/2];
- // 目的為了使 準則值R[low] 為這三個值的中間值
- int temp;
- if (iLeft>iMiddle)
- {
- temp=iMiddle;
- iMiddle=iLeft;
- iLeft=temp;
- }
- if (iRight>iMiddle)
- {
- temp=iMiddle;
- iMiddle=iRight;
- iRight=temp;
- }
- if (iLeft<iRight)
- {
- temp=iRight;
- iRight=iLeft;
- iLeft=iRight;
- }
- i=low;
- j=high;
- pivot=R[i];
- do
- {
- while((R[j]>=pivot)&&(i<j)) j--;
- if(i<j) R[i++]=R[j];
- while(R[i]<pivot&&(i<j)) i++;
- if(i<j) R[j--]=R[i];
- } while (i!=j);
- R[i]=pivot;
- /*
- if(low<i-1) QuickSort(R,low,i-1);
- if(high>i+1) QuickSort(R,i+1,high);
- */
- if(i-low>30)
- QuickSort(R,low,i-1);
- else
- StraightSelectionSort(R,i-low);
- if (high-i>30)
- QuickSort(R,i+1,high);
- else
- StraightSelectionSort(&R[i+1],high-i);
- }
形式2:
[cpp] view plaincopy
- void QuickSort(int R[], int n)
- {
- int i,j;
- int pivot;
- i=0;
- j=n-1;
- pivot=R[i];
- do
- {
- while((R[j]>=pivot)&&(i<j)) j--;
- if(i<j) R[i++]=R[j];
- while(R[i]<pivot&&(i<j)) i++;
- if(i<j) R[j--]=R[i];
- } while (i!=j);
- R[i]=pivot;
- if(i>1) QuickSort(R,i);
- if(n-i-1>1) QuickSort(&R[i+1],n-i-1);
- }
形式2---優化1
[cpp] view plaincopy
- void QuickSort(int R[], int n)
- {
- int i,j;
- int pivot;
- int & iLeft=R[0];
- int & iRight=R[n-1];
- int & iMiddle=R[(n-1)/2];
- // 目的為了使 準則值R[low] 為這三個值的中間值
- int temp;
- if (iLeft>iMiddle)
- {
- temp=iMiddle;
- iMiddle=iLeft;
- iLeft=temp;
- }
- if (iRight>iMiddle)
- {
- temp=iMiddle;
- iMiddle=iRight;
- iRight=temp;
- }
- if (iLeft<iRight)
- {
- temp=iRight;
- iRight=iLeft;
- iLeft=iRight;
- }
- i=0;
- j=n-1;
- pivot=R[i]; // 此時R[0]為 上述三值得中間值
- do
- {
- while((R[j]>=pivot)&&(i<j)) j--;
- if(i<j) R[i++]=R[j];
- while(R[i]<pivot&&(i<j)) i++;
- if(i<j) R[j--]=R[i];
- } while (i!=j);
- R[i]=pivot;
- if(i>1) QuickSort(R,i);
- if(n-i-1>1) QuickSort(&R[i+1],n-i-1);
- }
形式2-----優化2
[cpp] view plaincopy
- void QuickSort(int R[], int n)
- {
- int i,j;
- int pivot;
- int & iLeft=R[0];
- int & iRight=R[n-1];
- int & iMiddle=R[(n-1)/2];
- // 目的為了使 準則值R[low] 為這三個值的中間值
- int temp;
- if (iLeft>iMiddle)
- {
- temp=iMiddle;
- iMiddle=iLeft;
- iLeft=temp;
- }
- if (iRight>iMiddle)
- {
- temp=iMiddle;
- iMiddle=iRight;
- iRight=temp;
- }
- if (iLeft<iRight)
- {
- temp=iRight;
- iRight=iLeft;
- iLeft=iRight;
- }
- i=0;
- j=n-1;
- pivot=R[i]; // 此時R[0]為 上述三值得中間值
- do
- {
- while((R[j]>=pivot)&&(i<j)) j--;
- if(i<j) R[i++]=R[j];
- while(R[i]<pivot&&(i<j)) i++;
- if(i<j) R[j--]=R[i];
- } while (i!=j);
- R[i]=pivot;
- /*
- if(i>1) QuickSort(R,i);
- if(n-i-1>1) QuickSort(&R[i+1],n-i-1);
- */
- if(i>30)
- QuickSort(R,i);
- else
- StraightSelectionSort(R,i);
- if (n-i-1>30)
- QuickSort(R,n-i-1);
- else
- StraightSelectionSort(&R[i+1],n-i-1);
- }
[cpp] view plaincopy
- void StraightSelectionSort(int *p, int n)
- {
- int i,j,t;
- int indexMax;
- for (i=0;i<n;i++) // 0....n-1
- {
- // 未排元素 0...n-1-i 以排元素 n-i...n-1
- for (j=0,indexMax=0;j<n-i;j++)
- {
- if (p[j]>=p[indexMax])
- {
- indexMax=j;
- }
- }
- t=p[n-i-1];
- p[n-i-1]=p[indexMax];
- p[indexMax]=t;
- }
- }