這個排序,顧名思義,選擇,選擇,
第一步:從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...