#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...