幾種排序演算法,記錄一下
個人也就會四種排序(bubble,select,insert,quick),哈哈,看官大人可能有點失望。自己也看過幾種,不過一直沒寫過其他的,就記錄下這四種吧。
程式碼均可直接通過編譯。各種版本實現都有出入,不過思想都是一樣。工作這麼久還沒有一次性完全寫正確過,功力還是差點。
#include <iostream>
#include <algorithm>
using namespace std;
template <typename ITER>
void print(ITER begin,ITER end){
while(begin != end){
cout <<*begin << " ";
begin++;
}
cout << endl;
}
void bubblesort(int data[],size_t size)
{
for(size_t i = 0;i < size-1;++i){
bool ordered = true;
for(size_t j = 0;j < size-1-i;++j){
if(data[j+1] <data[j]){
swap(data[j+1],data[j]);
ordered = false;
}
if(ordered)
break;
}
}
}
void insertsort(int data[],size_t size){
for(size_t i = 1;i < size;++i){
int temp = data[i];
size_t j;
for(j = i;j > 0 && temp < data[j-1];--j)
data[j] = data[j-1];
if(j != i)
data[j] = temp;
}
}
void selectsort(int data[],size_t size){
for(size_t i = 0;i < size -1;++i){
size_t min = i;
for(size_t j = i+1;j < size;++j)
if(data[j] < data[min])
min = j;
if(min != i)
swap(data[i],data[min]);
}
}
void quicksort(int data[],size_t left,size_t right){
size_t p = (left+right)/2;
int pivot = data[p];
for(size_t i = left,j = right;i < j;){
while(!(i >= p || pivot < data[i]))
++i;
if(i < p){
data[p] = data[i];
p = i;
}
while(!(j <= p || data[j] <pivot))
--j;
if(j > p){
data[p] = data[j];
p = j;
}
}
data[p] = pivot;
if(p-left > 1)
quicksort(data,left,p-1);
if(right-p > 1)
quicksort(data,p+1,right);
}
int main()
{
int array[] = {2,3,3,1,7,8,6,9,4,0};
size_t size = sizeof(array)/sizeof(array[0]);
// bubblesort(array,size);
// selectsort(array,size);
// insertsort(array,size);
quicksort(array,0,size-1);
print(array,array+size);
}