演算法思想
快速排序也採用分治思想;
把原始的陣列篩選成較小和較大兩個子陣列,然後遞迴地排序兩個子陣列;
在分成較小和較大的兩個子陣列過程中,如何選定基準值很關鍵。
**實現
partition部分:
#include
#include
#include
using
namespace std;
void
swap
(vector<
int>
& nums,
int m,
int n)
;int
randrange
(int low,
int high)
;int
partition
(vector<
int>
& nums,
int low,
int high)
;//快速排序主體
void
quicksort
(vector<
int>
& nums,
int low,
int high)
//使得被選出的基準值,都是當前子陣列中的中間數
inline
intpartition
(vector<
int>
&nums,
int low,
int high)
}swap
(nums, i, j)
;return i;
}//針對陣列,將指定的兩個座標對應的數交換
inline
void
swap
(vector<
int>
&nums,
int m,
int n)
//從指定的範圍,隨機選取乙個整數
inline
intrandrange
(int low,
int high)
//列印陣列
void
printvector
(const vector<
int>
& a)
cout << endl;
}int
main
(int argc,
char
** ar**)
;quicksort
(a,0
, a.
size()
-1);
printvector
(a);
return0;
}
換湯不換藥,下面這份**沒有那麼短小函式:
#include
#include
#include
using
namespace std;
intpartition1
(vector<
int>
& nums,
int low,
int high)
;//快速排序主體
void
quicksort
(vector<
int>
& nums,
int low,
int high)
//整合版的partion
intpartition1
(vector<
int>
& nums,
int low,
int high)
}//結束後,i之前的所有的數都不大於基準值,i之後所有的數都大於基準值;退出的時候j=high
std::
swap
(nums[i]
, nums[j]);
//把j位置的數(基準值)換到i位置上來
return i;
}//列印陣列
void
printvector
(const vector<
int>
& a)
cout << endl;
}int
main
(int argc,
char
** ar**)
;quicksort
(a,0
, a.
size()
-1);
printvector
(a);
return0;
}
從兩端逼近:
/*靠譜的方法*/
void
quicksort1
(vector<
int>
& nums,
int left,
int right)
while
(nums[i]
<= target && i < j)
if(i < j)
} nums[left]
= nums[i]
; nums[i]
= target;
quicksort1
(nums, left, i -1)
;quicksort1
(nums, i +
1, right)
;return
;}
快速排序算方法
快速排序演算法的原理 在待排序的n個記錄中任取乙個記錄 通常取第乙個記錄 為分割槽標準,把所有小於該排序碼的記錄移到左邊,把所有大於該排序碼的記錄移到右邊,中間放所選記錄,稱之為一趟排序 然後,對前後兩個子串行分別重複上述過程。繼續下去,知道所有記錄都排好序。演算法 標頭檔案定義結構體 1 ifnd...
python快速排序的原理 理解快速排序演算法
快速排序的時間複雜度為o nlogn 空間複雜度為o n 根據 張小牛 的文章快速排序 quick sort 詳解,證明最優的排序演算法,其時間複雜度可為o nlogn 對應的空間複雜度可為o n 快速排序可實現理論最優效率,這可能是快速排序比較重要的原因吧。我們基於python學習寫一下快速排序吧...
排序算發 計數排序
前面已經記錄過插入排序,歸併排序,快速排序,堆排序等四種排序。它們都有個共性,就是通過多次比較來得出前後順序,這種叫做比較排序,當然除此之外也有非比較排序。今天記錄的計數排序就是一種非比較排序。算發思想 有一串資料,如果我們知道每乙個元素公升序在陣列中的第幾個,那麼我們就知道了公升序的結果。而對於如...