快速排序和其它的六種排序演算法小總結寫給自己看的

2021-09-26 05:28:52 字數 3529 閱讀 5770

這個排序,顧名思義,選擇,選擇,

第一步:從n個數中選擇最小的那個,放到第0個位置*

第二步:再從 第1個數 到 最後乙個數中,選擇最小的,放到第1個位置……

……第n步:再從 第n-1個數 到 最後乙個數中,選擇最小的,放到第n-1個位置

templatevoid selectionsort(t arr, int n) 

swap(arr[i], arr[minindex]); //將當前的數和最小的數進行交換

//這裡用的是c++ swap()是std裡自帶的

//建議自己寫乙個,因為c++自帶的swap()比自己寫的複雜,所以執行時間慢一點。

}}

個人感覺:自己寫的出來就好,沒什麼卵用

有n個泡泡,將它們隨機變成串成一串冰糖葫蘆

從上到下,並給它們標上序號,序號大小,從上依次遞減

0…n-1

我們選擇最後乙個泡泡,將它與它前乙個泡泡比較大小,如果小,

那麼,就將兩個泡泡對換.

直到當前的泡泡比前面的泡泡大。

拋棄當前的泡泡。

換前乙個泡泡當主角。

在迴圈上一操作。

唉。表述的太爛了。

templatevoid bubblesort(t arr, int n) 

n = newn;

} while (newn > 0);

}

其實沒什麼用啦

給你一排數字,從第二數字開始 ,和之前的數字進行比較,按照大小插入到合適的位置。

比如 4,5,9,1,4,2,6,9,2,4

第一次排序後: 4,5,9,1,4,2,6,9,2,4

第二次排序後: 4,5,9,1,4,2,6,9,2,4

第三次排序後: 1,4,5,9,4,2,6,9,2,4

直到遍歷完。

template void insertionsort(t arr, int n) //此時的j位置正好是大於等於前乙個數,小於後乙個數的

arr[j] = e; //最後一步插入;

}}

蠻重要的

希爾排序是插入排序的公升級版

有一組數:26,44,18,58,28,21,67,79,25,26,98,55

希爾排序是將它們分組後,對每組進行插入排序。

可以選擇乙個初值,比如將組距設定為3,然後為2,最後為1

組距為3: 26,58,67,26

44,28,79,98

18,21,25,55

58,67,26

28,79,98

21,25,55,

67,26

79,98

25,55

分別對每組進行插入排序

組距為2:類似

最後組距為1,這是這一組資料已經近乎有序了

我們都知道插入排序對近乎有序的陣列的時間複雜度為o(n);

這樣效能就會有所提公升。

template void shellsort(t arr, int n) 

h /= 3; //每次除以3 知道h=1

}}

把一排數一分為二,在把分好的二分之一,再一分為二,直到最小為1。

然後逐層往上,對每層進行歸併排序。(瞎講)

講起來費力,不講了,直接上**。

templatevoid insertionsort(t arr, int l, int r) 

}template void __merge(t arr, int l, int mid, int r)

int i = l; int j = mid + 1;

for (int k =l; k <= r; k++)

else if (j > r)

else if (aux[i - l] > aux[j - l])

else

} delete aux;

}template void __mergesort(t arr, int l, int r)

int mid = (l + r) / 2;

__mergesort(arr, l, mid);//對左邊歸併

__mergesort(arr, mid + 1, r);//對右邊歸併

if(arr[mid]>arr[mid+1])//如果左邊的最大值小於右邊的最小值,那麼就省去這一步,在有序的陣列中很有用。

__merge(arr, l, mid, r);//進行排序

}template void mergesort(t arr, int n)

這個不需要遞迴,只需要迭代

template//buttom up

void mergesortbu(t arr, int n)

} swap(arr[l], arr[j]);

return j;

}templatevoid __quicksort(t arr, int l, int r)

templatevoid quicksort(t arr, int n)

雙路

templateint partition2(t arr, int l, int r) 

swap(arr[l], arr[j]);

return j;

}templatevoid __quicksort2(t arr, int l, int r)

int p = partition2(arr, l, r);

__quicksort2(arr, l, p - 1);

__quicksort2(arr, p + 1, r);

}templatevoid quicksort2(t arr, int n)

三路(在有重複鍵值的數中,三路比雙路快)

templatevoid __partition(t arr, int l, int r) 

else if (arr[i] > v)

else

} swap(arr[l], arr[lt]);

__partition(arr, l, lt - 1);

__partition(arr,gt,r);

}templatevoid quicksort3(t arr, int n)

這是我自己實驗下來的結果(100萬個數排序)

1.在有重複鍵值的陣列中,三路快排最快,(重要)

2.在隨機數組中快排比歸併快一點,(不重要)

3.在近乎有序的陣列中,雙路和歸併快一點。(不重要)

template void shiftdown(t arr, int n, int k) 

}template void heapsort(t arr, int n)

}

演算法的六種排序

一 選擇排序法 簡單選擇排序是最簡單直觀的一種演算法,基本思想為每一趟從待排序的資料元素中選擇最小 或最大 的乙個元素作為首元素,直到所有元素排完為止,簡單選擇排序是不穩定排序。for int i 0 i arr.length 1 i 簡單選擇排序通過上面優化之後,無論陣列原始排列如何,比較次數是不...

六種基本排序方式

package new03 public class demo4 sop 原序列的結果是 for int x nums sop n selectsort nums insertsort nums bubblesort nums quicksort nums shellsort nums heapso...

六種qsort排序方法

本文中排序都是採用的從小到大排序 一 對int型別陣列排序 int num 100 sample int cmp const void a const void b qsort num,100,sizeof num 0 cmp 二 對char型別陣列排序 同int型別 char word 100 s...