数据结构中常见的8种排序算法的C++代码实现

2018-12-05 20:50

//整理者:LXZ-2008 百度文库笔名:锡永

//时间:2011/9/29

//学校:CUMT 2012届毕业 计算机科学与技术学院 计算机科学与技术专业 //内容:数据结构中常见的8种排序算法的C++代码实现 //全是内排序,稳定的排序算法:冒泡,插入,归并,基数 //不稳定的排序算法:希尔,快速,堆,选择

//邮箱:706625262@qq.com(仅供交流,不做技术支持)

//备注:我想大家在大二的时候可能已经熟悉这些排序了,但是不知道

// 大四时还能不能快速地写出这些排序算法,这些思想上掌握了,也不见得复杂 // 通过一次失败的机试,让我清楚编程时简洁的重要性,以及重温这些经典排序算法 // 以及快速编程的重要性。这次我花了3天重温了这些经典排序算法, // 并自己根据思想重新写了一下。

//头文件包含及命名空间引用 #include using namespace std;

//函数声明

void bubble_sort(int n[],int length);//冒泡排序 void selection_sort(int n[],int length);//选择排序 void insertion_sort(int n[],int length);//插入排序 void shell_sort(int n[],int length);//希尔排序

void quick_sort(int n[],int length);//快速排序接口 void quicksort(int n[],int first,int last);//快速排序 void merge_sort(int n[],int length);//归并排序接口

void mergesort(int n[],int first,int last);//归并排序

void Merge(int n[],int first,int middle,int last);//归并排序中的合并 void base_sort(int n[],int length);//基数排序接口 void heap_sort(int n[],int length);//堆排序接口

void buildmaxheap(int n[],int begin,int end);//建立最大堆 void maxheapify(int n[],int begin,int end);//调整最大堆 void Display(int n[],int length,bool state);//输出函数

typedef void ( * SortFuntion) (int n[],int length);//排序函数指针类型

//排序算法函数列表 SortFuntion sortfution[] = {

bubble_sort,//冒泡排序 selection_sort,//选择排序

insertion_sort,//插入排序 shell_sort,//希尔排序 quick_sort,//快速排序 merge_sort,//归并排序 base_sort,//基数排序

heap_sort//堆排序

};

//main funtion int main(){

int sortS[] = {8,6,2,18,4,3,26,61,72,15}; int sortD[] = {8,6,2,18,4,3,26,61,72,15};

/*

for(int i = 0; i < sizeof(sortfution)/sizeof(SortFuntion); i++){ cout<<\Display(sortD,sizeof(sortD)/sizeof(int),false); sortfution[i](sortD,sizeof(sortD)/sizeof(int)); Display(sortD,sizeof(sortD)/sizeof(int),true); cout<<\memcpy(sortD,sortS,sizeof(sortfution)); }

*/

Display(sortD,sizeof(sortD)/sizeof(int),false);//输出排序前的序列 heap_sort(sortD,sizeof(sortD)/sizeof(int));//排序

Display(sortD,sizeof(sortD)/sizeof(int),true);//输出排序后的序列 return 0;

}

//调整最大堆

void maxheapify(int n[],int begin,int end){ }

int r(begin);

if(2 * begin > end) return;

if(n[begin] < n[2*begin]) r = 2*begin;

if(2 * begin + 1 <= end && n[r] < n[2 * begin + 1]) r = 2*begin + 1; if(r!=begin){ int temp = n[begin]; }

n[begin] = n[r]; n[r] = temp; maxheapify(n,r,end);

//建立最大堆

void buildmaxheap(int n[],int begin,int end){ for(int i = begin; i > 0; i--) maxheapify(n,i,end);

}

//堆排序接口

void heap_sort(int n[],int length){ cout<<\ }

int *temp_n = new int[length + 1]; int end(length);

memcpy(temp_n+1,n,length * sizeof(int)); buildmaxheap(temp_n,length/2,length); do{

temp_n[0] = temp_n[1]; temp_n[1] = temp_n[end]; temp_n[end] = temp_n[0]; maxheapify(temp_n,1,--end);

}while(end >= 1);

memcpy(n,temp_n+1,length * sizeof(int)); delete []temp_n;

//基数排序接口

void base_sort(int n[],int length){

cout<<\ const int base = 10; //node class node {

public:

int data; node *next; node(){next = 0;}

}*current = 0 ,*head = 0,*pre; //malloc

node **box = new node *[base]; int i;

for(i = 0; i < base; i++) box[i] = new node; current = head = new node; //排序数据输入到当前链表中 int max(0);

for(i = 0;i < length; i++){ current = current -> next = new node;

current -> data = n[i]; if(max <= n[i]) max = n[i]; //找出最大的数

}

int k(0); while(max){ max /= base; k++; }//计算最大数的位数 int radix = 1; int order(0); node *p = 0; node *pnext = 0; for(i = 0; i < k; i++){

current = head -> next;//链表第一个节点 //拆链表

while(current){

order = (current -> data / radix) % base; p = box[order]; while(p -> next) p = p -> next; p -> next = current; current = current -> next; p -> next -> next = 0;

}

//找到第一个节点 int j (0);

for(j = 0; j < base; j++){

if(p = box[j]->next){ break;

} }

//合链表 head -> next = p; while(p -> next) p = p -> next; //next node while(++j < base){ if(pnext = box[j] -> next)

{

p -> next = pnext; p = p -> next; while( p -> next) p = p -> next;

}

}

radix *= base;

}

for(j = 0; j < base; j++){

box[j] -> next = 0; } }

//排序后将结果写入n数组中 current = head;

for(i = 0; current = current -> next ; i++){ }

n[i] = current -> data;

//dealloc

pre = current = head; while(pre){ }

current = pre -> next; delete pre; pre = current;

for(i = 0; i < base; i++) delete box[i]; delete []box;

//归并排序接口

void merge_sort(int n[],int length){ cout<<\ mergesort(n,0,length - 1); }

//归并排序中的合并

void Merge(int n[],int first,int middle,int last){ int bigin1 = first, bigin2 = middle + 1;

int end1 = middle,end2 = last; int *temp = new int [last-first + 1]; int i(0);

while(bigin1 <= end1 && bigin2 <= end2){ }

if(n[bigin1] < n[bigin2]) temp[i++] = n[bigin1++]; else

temp[i++] = n[bigin2++];

while(bigin1 <= end1) temp[i++] = n[bigin1++]; while(bigin2 <= end2) temp[i++] = n[bigin2++]; i = 0;


数据结构中常见的8种排序算法的C++代码实现.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:盾构施工方案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: