各种排序算法的练习

来源:互联网 发布:河北师大软件学院 编辑:程序博客网 时间:2024/06/02 03:32

要准备面试笔试了,很多基础知识需要巩固下。排序和查找是必须要掌握的基础知识,参考链接如下:

http://www.cnblogs.com/kkun/archive/2011/11/23/2260312.html


代码如下:

#include<stdio.h>#include<stdlib.h>#include<time.h>#include<limits.h>#include<iostream>#include<vector>#include<algorithm>#include<string.h>#include<map>using namespace std;void bubble_sort(int *a, int len){int i,j;for(i=0; i<len; i++){for(int j=i+1; j<len; j++){if(a[i] > a[j]){int tmp = a[j];a[j] = a[i];a[i] = tmp;}}}}void insert_sort(int *a, int len){for(int i=1; i<len; i++){int tmp = a[i];int j = 0;for(j=i-1; j >= 0; j--){if(tmp < a[j]){a[j+1] = a[j];}elsebreak;}a[j+1] = tmp;}}void bin_insert_sort(int *a, int len){int guard = a[0];for(int i=1; i<len ;i++){if(a[i] < a[i-1]){int guard = a[i];int l = 0;int r = i-1;while(l <= r){int mid = (l+r)/2;if(guard < a[mid])r = mid-1;elsel = mid+1;}int j = 0;for(j=i-1; j>= r+1; j--)a[j+1] = a[j];a[j+1] = guard;}}}void shell_sort(int *a, int len){int i, j , gap;for(gap = len / 2; gap > 0; gap /= 2){for(i=0; i < gap; i++){for(j = i + gap; j < len; j += gap){if(a[j] < a[j-gap]){int tmp = a[j];int k = j - gap;while(k >= 0 && a[k] > tmp){a[k+gap] = a[k];k -= gap;}a[k+gap] = tmp;}}}}}int partition(int *a, int st, int ed){int guard = a[st];int l = st;int r = ed;while(l < r){while(l < r && a[r] > guard)r--;a[l] = a[r];while(l < r && a[l] <= guard)l++;a[r] = a[l];}a[l] = guard;return l;}void quick_sort(int *a,int st, int ed){if(!a)return ;int loc = 0;if(st < ed){loc = partition(a, st, ed);quick_sort(a, st, loc - 1);quick_sort(a, loc + 1, ed);}}void merge(int *a, int st, int mid, int ed, int *tmp){if(!a || !tmp)return ;int i = st;int j = mid+1;int cnt = st;for(; i<=mid && j <= ed;){if(a[j] > a[i])tmp[cnt++] = a[i++];elsetmp[cnt++] = a[j++];}while(i <= mid)tmp[cnt++] = a[i++];while(j <= ed)tmp[cnt++] = a[j++];for(i = st; i<= ed; i++)a[i] = tmp[i];}void merge_sort(int *a, int st, int ed, int *tmp){if(!a)return;if(st < ed){int mid = (st + ed)/2;merge_sort(a, st, mid , tmp);merge_sort(a, mid + 1, ed, tmp);merge(a, st, mid , ed, tmp);}}void select_sort(int *a, int len){if(!a )return;int i ,j;for(i=0; i<len; i++){int min = INT_MAX;int index = -1;for(j=i; j<len; j++){if(a[j] < min){min = a[j];index = j;}}if(index != j){a[index] = a[i];a[i] = min;}}}#define LEFT(x)    ((x << 1) + 1)#define RIGHT(x) ((x + 1) << 1)#define PARENT(x) (((x + 1) >> 1) - 1)void maxHeapify(int *a, int index, int heapsize){if(a == NULL) return;int i = 2*index + 1;int rc = a[index];for(; i < heapsize; i= 2*i+1){if(i<heapsize - 1 && a[i] < a[i+1] )i++;if(rc > a[i])break;a[index] = a[i];index = i;}a[index] = rc;}void maxHeapBuild(int *a, int heapsize){int index = PARENT(heapsize - 1);for(int i=index; i>=0 ; i--){maxHeapify(a, i, heapsize);}}void maxheap_sort(int *a, int heapsize){maxHeapBuild(a, heapsize);for(int i = heapsize; i > 0; i --){int tmp = a[i-1];a[i-1] = a[0];a[0] = tmp;maxHeapify(a,0,i-1);}}void minHeapify(int *a, int index, int heapsize){if(!a )return;int i = 2*index + 1;int rc = a[index];for(; i < heapsize; i = i*2 + 1){if(i<heapsize-1 && a[i+1] < a[i])i++;if(rc < a[i])break;a[index] = a[i];index = i;}a[index] = rc;}void minHeapBuild(int *a, int heapsize){int index = PARENT(heapsize - 1);for(int i=index; i>=0; i--)minHeapify(a, i, heapsize);}void minheap_sort(int *a, int heapsize){minHeapBuild(a, heapsize);for(int i=heapsize; i>0; i--){int tmp = a[i-1];a[i-1] = a[0];a[0] = tmp;minHeapify(a, 0, i-1);}}void bucket_sort(int *a,int len, int maxbucket){if(!a)return;if(len < 1)return;int *tmp = (int *)malloc(sizeof(int) * maxbucket);memset(tmp, 0, sizeof(int)*maxbucket);for(int i=0; i < len; i++)tmp[a[i]]++;for(int i=0; i < maxbucket; i++){int cnt = tmp[i];if(cnt > 0){while(cnt--)*a++ = i;}}free(tmp);}int main(){time_t lt = time(NULL);srand(lt);int len = 20;int data[len];vector<int > vdata;for(int i=0; i<len; i++){data[i] = rand()%100;vdata.push_back(data[i]);}for(int i=0; i<len; i++)cout <<"\t"<<data[i];cout << endl;cout << endl;//bubble_sort(data, len);//insert_sort(data, len);//bin_insert_sort(data, len);//quick_sort(data, 0, len-1);//int *tmp = (int *)malloc(sizeof(int) * len);//merge_sort(data, 0, len-1, tmp);//free(tmp);//select_sort(data, len);//minheap_sort(data, len);//bucket_sort(data, len, 100);shell_sort(data, len);for(int i=0; i<len; i++)cout <<"\t"<<data[i];cout << endl;sort(vdata.begin(), vdata.end());bool match = true;for(int i=0; i<len; i++){if(vdata[i] != data[i]){match = false;break;}}printf("sort \t%s\tsuccessful\n", match?"is" : "not");}



0 0