【資料結構】快排!!!
快速排序是C.R.A.Hoare於1962年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其為分治法(Divide-and-ConquerMethod)。
該方法的基本思想是:
1.先從數列中取出一個數作為基準數。
2.分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。
3.再對左右區間重複第二步,直到各區間只有一個數。
方法一:
注:在陣列的左右兩邊定義兩個指標,分別指向陣列的最前面和最後面,當其那面的left指向的資料大於key值,那麼right從後面向前面尋找第一個小於key值的資料,當left
int pation3(int * arr,int left,int right)
{
if(NULL == arr)
return -1;
int key = arr[right];
int cur = right;
while(left < right)
{
while(left < right && arr[left] > key)
left++;
while(left < right && arr[right] < key)
right--;
if(left < right)
swap(arr[left] ,arr[right]);
left ++ ;
right--;
}
swap(arr[right + 1],arr[cur]);
return right+1;
}
void fastsort(int* arr,int left ,int right)
{
if(left < right)
{
int key = pation3(arr,left,right);
fastsort(arr,left,key-1);
fastsort(arr,key+1,right);
}
}
方法二:挖坑法
注:定義兩個指標,分別指向陣列的最其前面和最後面的元素,在key裡面儲存陣列裡面的最後一個元素,那麼left從前面向後面查詢第一個大於key值的值,並將left對應的值賦給right對應的值,再從right從後面向前面走,找到第一個小於key值的值,並且將right裡面的值賦給left,當left>right的時候迴圈終止。
實現程式碼:
template<class T>
int pation(T* arr,int left,int right)
{
if(NULL == arr)
return -1;
int tmp = arr[right];
int begin = left;
int end = right;
while(begin < end)
{
while(begin < end && arr[begin] < tmp)
begin++;
if(begin < end)
arr[end] = arr[begin];
while(begin < end && arr[end] > tmp)
end--;
if(begin < end )
arr[begin] = arr[end];
begin++;
end--;
}
arr[end+1] = tmp;
return end+1;
}
方法三:
注:定義兩個指標,cur指向left,pre指向left前面的位置,cur一直向後走,當找到第一個大於key的值的時候將cur和pre裡面的值進行互換,當cur
template<class T>
int pation4(T * arr,int left,int right)
{
if(NULL == arr)
return -1;
int cur = left;
int pre = cur-1;
T key = arr[right];
while(cur < right)
{
if(cur != pre && arr[cur] > key)
swap(arr[++pre],arr[cur]);
cur++;
}
swap(arr[pre+1],arr[right]);
return pre+1;
}
以上三種呼叫程式碼如下:
template<class T>
void fastsort(T* arr,int left ,int right)
{
if(left < right)
{
int key = pation4(arr,left,right);
fastsort(arr,left,key-1);
fastsort(arr,key+1,right);
}
}
相關文章
- 冒泡、選擇、快排、插入排序—效能簡單測試/rand()邊界值——c++資料結構排序C++資料結構
- 結構化資料、半結構化資料和非結構化資料
- 【資料結構篇】認識資料結構資料結構
- Redis 為何這麼快?聊聊它的資料結構~Redis資料結構
- 資料結構小白系列之資料結構概述資料結構
- 資料結構?資料結構
- 資料結構資料結構
- 資料結構與演算法-資料結構(棧)資料結構演算法
- 【PHP資料結構】PHP資料結構及演算法總結PHP資料結構演算法
- 快排分析
- 前端學習資料結構1 二分排序樹(BST)前端資料結構排序
- 資料結構-棧資料結構
- 資料結構-堆資料結構
- 資料結構-集合資料結構
- 資料結構 - 字串資料結構字串
- 資料結構——列表資料結構
- Redis 資料結構Redis資料結構
- 資料結構——樹資料結構
- Redis資料結構Redis資料結構
- 資料結構-樹資料結構
- Java資料結構Java資料結構
- 資料結構---串資料結構
- 資料結構|前言資料結構
- 資料結構——堆資料結構
- spacy資料結構資料結構
- 資料結構-Tree資料結構
- 資料結構:集合資料結構
- 資料結構模板資料結構
- 索引資料結構索引資料結構
- Map 資料結構資料結構
- 資料結構 - 棧資料結構
- 資料結構 - 堆資料結構
- 14 資料結構資料結構
- 資料結構 - 圖資料結構
- [資料結構]堆資料結構
- 模板 - 資料結構資料結構
- 【模板】資料結構資料結構
- mysql資料庫-資料結構MySql資料庫資料結構