您的位置:首页 > 其它

排序算法大总结

2008-03-16 14:37 459 查看

#include <iostream>


#include <ctime>


using namespace std;




const int MaxArraySize = 16374;




#ifdef RAND_MAX


#undef RAND_MAX


#define RAND_MAX    1000000


#endif




template <class T>




void bubble_sort(T* array, int s) ...{


bool exchange = true;


int i;




while(exchange) ...{


exchange = false;




for(i = 0; i < s - 1; i++) ...{




if(array[i] > array[i+1]) ...{


T t = array[i];


array[i] = array[i+1];


array[i+1] = t;


exchange = true;


}


}


}


}




template <class T>




void bubble_sort_bound(T* array, int s) ...{


int bound = s - 1, i, t;




while(bound) ...{


t = 0;




for(i = 0; i < bound; i++) ...{




if(array[i] > array[i+1]) ...{


T temp = array[i]; array[i] = array[i+1]; array[i+1] = temp;


t = i;


}


}


bound = t;


}


}




template <class T>




void bubble_sort_bigo(T* array, int s) ...{


int first = 0, last = s-1, i, t;


T temp;




while(first < last) ...{




for(i = first, t = first; i < last; i++) ...{




if(array[i] > array[i+1]) ...{


temp = array[i]; array[i] = array[i+1]; array[i+1] = temp;


t = i;


}


}


last = t;




for(i = last, t = last; i > first; i--) ...{




if(array[i] < array[i-1]) ...{


temp = array[i]; array[i] = array[i-1]; array[i-1] = temp;


t = i;


}


}


first = t;


}


}




template <class T>




void insertion_sort(T* array, int s) ...{


int i,j;


T t;




for(i = 1; i < s; i++) ...{


t = array[i];


j = i - 1;




while(j >= 0 && array[j] > t) ...{


array[j+1] = array[j];


j--;


}


array[j+1] = t;


}


}




template <class T>




void insertion_sort_x(T* array, int s) ...{


int i, j, low, high, mid;


T t;




for(i = 1; i < s; i++) ...{


low = 0; high = i - 1; t = array[i];




while(low <= high) ...{


mid = (low + high) / 2;


if(array[mid] <= t) low = mid + 1;


else if(array[mid] >= t) high = mid - 1;


}


for(j = i - 1; j > high; j--)


array[j+1] = array[j];


array[j+1] = t;


}


}






template <class T>




void select_sort(T* array, int s) ...{


int i,j,k;




for(i = 0; i < s; i++) ...{


k = i;




for(j = i + 1; j < s; j++) ...{


if(array[j] < array[k])


k = j;


}


T t = array[i];


array[i] = array[k];


array[k] = t;


}


}




template <class T>




void merge_sort_x(T* array, int begin, int end) ...{




if(end - begin +1 <= 16) ...{


int i,j;


T t;




for(i = begin + 1; i <= end; i++) ...{


j = i - 1; t = array[i];




while(j >= begin && array[j] > t) ...{


array[j+1] = array[j];


j--;


}


array[j+1] = t;


}


return;


}




if(begin < end) ...{


int mid = (begin + end) / 2;


merge_sort_x(array, begin, mid);


merge_sort_x(array, mid+1, end);


merge_array(array, begin, mid, end);


}


}




template <class T>




void merge_sort_x(T* array, int s) ...{


merge_sort_x(array, 0, s-1);


}




template <class T>




void merge_sort(T* array, int begin, int end) ...{




if(begin < end) ...{


int mid = (begin + end) / 2;


merge_sort(array, begin, mid);


merge_sort(array, mid+1, end);


merge_array(array, begin, mid, end);


}


}




template <class T>




void merge_sort(T* array, int s) ...{


merge_sort(array, 0, s-1);


}




template <class T>




void merge_array(T* array, int begin, int mid, int end) ...{


T *temp = new T[end - begin + 2];


int i = begin,j = mid+1,k = 0;




while(i <= mid && j <= end) ...{


if(array[i] > array[j])


temp[k++] = array[j++];


else


temp[k++] = array[i++];


if(i > mid || j > end)


break;


}


if(i > mid)


while(j <= end) temp[k++] = array[j++];


else


while(i <= mid) temp[k++] = array[i++];




for(i = begin, k = 0; i <= end; i++)


array[i] = temp[k++];


delete[] temp;


}




template <class T>




void build_heap(T* array, int root, int end) ...{


int l = root * 2 + 1, r = root * 2 + 2, b = array[root];


T t;






if(l < end) ...{


if(array[l] > array[root])


b = array[l];


}




if(r < end) ...{


if(array[r] > b)


b = array[r];


}






if(b != array[root]) ...{


t = array[root];


array[root] = b;




if(b == array[l]) ...{


array[l] = t;


build_heap(array, l, end);




} else if(b == array[r]) ...{


array[r] = t;


build_heap(array, r, end);


}


}


}




template <class T>




void heap_sort(T* array, int s) ...{


for(int i = (s - 1)/2; i >= 0; i--)


build_heap(array, i, s);




for(i = s-1; i > 0; i--) ...{


T t = array[0];


array[0] = array[i];


array[i] = t;


build_heap(array, 0, i);


}


}




template <class T>




void quick_sort(T* array, int begin, int end) ...{


T key = array[begin];


int i = begin, j = end;




if(begin < end) ...{




while(i < j) ...{


while(++i < end && array[i] < key);


while(--j > begin && array[j] > key);




if(i < j) ...{


T t = array[i]; array[i] = array[j]; array[j] = t;


}


}


array[begin] = array[j];


array[j] = key;


quick_sort(array, begin, j);


quick_sort(array, j+1, end);


}


}




template <class T>




void quick_sort(T* array, int s) ...{


quick_sort(array, 0, s);


}




template <class T>




void quick_sort_x(T* array, int begin, int end) ...{


int i,j;


T t;




if(end - begin <= 16) ...{




for(i = begin + 1; i < end; i++) ...{


j = i - 1; t = array[i];




while(j >= begin && array[j] > t) ...{


array[j+1] = array[j]; j--;


}


array[j+1] = t;


}


return;


}




if(begin < end) ...{


t = array[begin];


i = begin;


j = end;




while(i < j) ...{


while(++i < end && array[i] < t);


while(--j > begin && array[j] > t);




if(i < j) ...{


T temp = array[i]; array[i] = array[j]; array[j] = temp;


}


}


array[begin] = array[j];


array[j] = t;


quick_sort_x(array, begin, j);


quick_sort_x(array, j+1, end);


}


}




template <class T>




void quick_sort_x(T* array, int s) ...{


quick_sort_x(array, 0, s);


}






template <class T>




void print(T* array, int s) ...{


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


cout << array[i] << ' ';


cout << endl;


}






void generate_test(int *array, int s) ...{


srand(time(NULL));


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


array[i] = rand();


}








void sleep(clock_t wait) ...{


clock_t dest = clock() + wait;


while(dest > clock());


}






template <class T>




struct SortF ...{


void (*test_f)(T* array, int);


char *description;


};




int testArray[MaxArraySize], testCopy[MaxArraySize], i;






int main() ...{


clock_t start, finish;








SortF<int> function_array[] = ...{


bubble_sort, "普通的冒泡排序,到没有交换时停止",


bubble_sort_bound, "改进的冒泡排序,记录最后一次交换位置",


bubble_sort_bigo, "改进的冒泡排序,双向进行冒泡",


insertion_sort, "普通插入排序",


insertion_sort_x, "改进的插入排序,使用二分检索查找插入位置",


select_sort, "选择排序",


heap_sort, "堆排序",


quick_sort, "普通快速排序",


quick_sort_x, "改进的快速排序,小范围内使用插入排序改进",


merge_sort, "普通合并排序",


merge_sort_x, "改进后的合并排序,小范围内使用插入排序改进"


};




generate_test(testCopy, MaxArraySize);




for(i = 0; i < sizeof(function_array)/sizeof(SortF<int>); i++) ...{


cout << "test  " << function_array[i].description << endl;




memcpy(testArray, testCopy, sizeof(testArray));




cout << "before sort: ";


if(MaxArraySize <= 40)


print(testArray, MaxArraySize);




start = clock();


function_array[i].test_f(testArray, MaxArraySize);


finish = clock();




cout << "after sort: ";


if(MaxArraySize <= 40)


print(testArray, MaxArraySize);




cout << "consume time: " << (double)(finish - start) / CLOCKS_PER_SEC << endl << endl << endl;


//sleep(1000);


}




return 0;


}





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: