快速排序:
快速排序也是一種分治的遞迴演算法。
取陣列s中任一元素v,作為樞紐元。用樞紐元將s中的元素分成倆部分,對這兩部分分別再次進行快速排序。當s中元素個數是0或1時,則返回。因為快速排序要根據樞紐元將元素分成倆部分,因此,樞紐元的選取對程式的時間複雜度是有影響的。一般的樞紐元選取策略是取左端、右端和中間位置上的三個元素的中值作為樞紐元。
#include
using
namespace
std;
typedef
intelementtype
;void
print
(inta,
intn
)cout
<<
endl;}
void
swap
(elementtype
*lhs
,elementtype
*rhs
)void
insertionsort
(elementtypea[
],intn )
}elementtype
median3
(elementtypea[
],int
left
,int
right
)#define
cutoff(3
)//確保有三個元素用於查詢樞紐元
void
qsort
(elementtypea[
],int
left
,int
right
)//先將i+1,移過左端第乙個,再和樞紐元進行比較,因為在選擇樞紐元的時候已經將a[left]與樞紐元比較過了,而且
while(a
[--j ]
>
pivot
)//先將j-1,移過右端第二個,再和樞紐元進行比較,因為在選擇樞紐元的時候已經將右端第二個與樞紐元比較過了if(
i swap(&
a[i ],&a
[j ]);
//將i移過小於樞紐元的元素,將j移過大於樞紐元的元素。若i仍然小於j。就交換指標i和j所在的元素。
else
break
;//否則就結束。
}swap(&
a[i ],&a
[right-1
]);//將樞紐元放到左右部分元素交匯處。
qsort(a
,left,i
-1);對左右部分遞迴呼叫快速排序
qsort(a
,i +1
,right);}
else
/* do an insertion sort on the subarray */
insertionsort(a
+left
,right
-left+1
);}void
quicksort
(elementtypea[
],intn )
intmain();
print(a
,10);quicksort(a
,10);print(a
,10);system
("pause"
);return0;
}
十個元素:
先找出第乙個位置、最後乙個位置以及中間位置處的元素的中間值[(left+right)/2]向下取整作為樞紐元,找到樞紐元與最後乙個位置處的值交換。
初始時刻i指向第乙個元素,j指向倒數二個元素,最後乙個位置存放的是樞紐元。此時,i所指向的元素大於樞紐元,停止。j往前移動指向2,j所指向的元素小於樞紐元,停止。將i和j所指向的值進行交換。
i向後移動,直到i指向9,大於樞紐元,停止。j往前移動指向5,j所指向的元素小於樞紐元,停止。將i和j所指向的值進行交換。
這時,i繼續向後移,移過那些小於樞紐元的元素,直到i指向9,大於樞紐元,停止。j向前移移過大於樞紐元的元素,直到j指向3,小於樞紐元,停止。
此時i>j.i以後的元素全部大於樞紐元,i以前的元素全部小於樞紐元。因此,不再交換。
這時,整個陣列被樞紐元分成倆部分,第一部分:left到i-1位置上的元素均小於樞紐元。第二部分:i+1到right部分的元素均大於樞紐元。分別對這兩部分再次進行快速排序。最終得以將陣列全部排好序。
簡易演算法實現:
#includeusing namespace std;
#define max 255
void quicksort(int *a,int left, int right)
else
break;
} temp = a[left];
a[left] = a[j];
a[j] = temp;
quicksort(a,left,j-1);
quicksort(a, j+1, right);
}int main()
quicksort(a,0, n-1);
cout << "經過排序後的陣列為:" << endl;
for (int i = 0; i < n; i++)
}
常用排序演算法之快速排序
快速排序最壞情況執行時間為o n2 但實際中通常都是用於排序的最佳的實用選擇,因為其平均效能相當好 期望的執行時間為o nlgn 且o nlgn 記號中隱含的常數因子很小。快速排序是一種就地排序。同時,是一種不穩定的排序。本文內容主要參照演算法導論。快速排序主要利用了分治的思想。一般分為三步進行 分...
常用演算法之快速排序
演算法對開發的重要性不言而喻,所以準備記錄一些常用演算法。本篇文章先介紹一下快速排序演算法。這是在實際中最常用的一種排序演算法,速度快,效率高。快速排序是非常優秀的排序演算法。它是由是c.r.a.hoare於1962年提出的一種劃分交換排序。它採用了一種分治的策略,屬於分治法 divide and ...
排序演算法之快速排序
快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 從數列中挑出乙個元素,稱為 基準 pivot 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分割槽退出...