快速排序(三路劃分)解決大量重複元素

2021-08-27 02:24:08 字數 1850 閱讀 7793

#include#include#include#define m 20

using namespace std;

static int count_insert = 0;

static int count_partion = 0;

typedef struct index

index;

void swap(int& small, int& big)

/*|簡述下插入排序:

||cur = 1 -> right 為待排序部分,pre代表已排序部分。

||先把當先位置元素arr[cur]存入tmp,然後比較arr[pre]和arr[cur],

|如果待排序部分arr[cur] < arr[pre],則arr[pre + 1] = arr[pre]移位

|移位的目的是把較小的元素,這裡是arr[cur]放入到已排序部分適當的位置

|這樣每次arr[cur]都會被arr[pre]所覆蓋,這也就是為什麼剛開始tmp = arr[cur]的原因

|然後把tmp放置到arr[pre]位置處

*/void insert_sort( int arr, int left, int right)

arr[pre] = tmp;

} count_insert += 1;}/*

|簡述下演算法思路:

|當出現大量重複元素時,顯然可以加以控制,改進效率。

||在劃分迴圈中,每當掃瞄指標(i, j)停止時,交換i,j處的元素;

|同時判斷指標處元素是否等於劃分元素base;

|如果arr[i]等於劃分元素,則把arr[i]和陣列左邊的元素交換;

|如果arr[j]等於劃分元素,則把arr[j]和陣列右邊的元素。

||最後把兩端的和劃分元素相等的區域,移到陣列中間來。

*/index partion(int arr, int left, int right)

if ( arr[j] == base )

}//for

swap( arr[right], arr[i]); //@_4

j = i - 1; i = i + 1;

for (tag = left; tag <= pleft; tag++, j--) swap(arr[tag], arr[j]);

for (tag = right - 1 ; tag >= pright; tag--, i++) swap(arr[tag], arr[i]);//@_5

p.left = j, p.right = i ;

count_partion += 1;

return p; }/*

| 如果劃分後子檔案的長度小於20,則用插入排序,

|否則快速排序。

|在經過n此遞迴劃分後,會產生大量的比如長度為arr[0 -> 10]這樣的小檔案

|此時繼續快速排序顯然得不償失。

*/void quick_sort(int arr, int left, int right) }}

int main(){

const int size = 500;

static int s[size];

srand(unsigned int ( time(null)));

for (int i = 0; i < size; i++)

s[i] = rand()%100;

quick_sort(s, 0, size-1);

for (i = 0; i < size; i++)

cout << s[i] << " ";

cout << endl;

cout << "call insert_sort " << count_insert << " times" <

快速排序之三路快速排序

之前介紹了快速排序和優化版的快速排序 下面再來介紹一種 三路快速排序 實現 三路快速排序 template typename t static void quicksort3ways t arr,int n template typename t static void quicksort3ways...

C 實現快速排序 雙路快速排序 三路快速排序

從左向右依次遞迴 如果 陣列中的元素都相等,就會變成 n 級別的複雜度演算法 public class quicksort public static void sort t arr where t system.icomparable public static void sort2 t arr ...

9 5 三路快速排序演算法

外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳 img ite3pzje 1610469861174 c0cea802827c4c1d86a9e54022cd6e42 外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳 img cdnyb47s 1610469861177 d4a...