数据结构 排序算法 (插入、快速、Shell、堆、合并)
来源:互联网 发布:榕基软件怎么样 编辑:程序博客网 时间:2024/05/07 07:31
#include "stdio.h"#include "time.h"#include "stdlib.h"#define MAX 10#define SWAP(x,y){int t=x;x=y;y=t;}void RandNumber(int []);//产生随机数void PrintNumber(int []);//打印void InsertSort(int []);//插入排序void BInsertSort(int []);//折半排序(插入升级版)void ShellSort(int []);//Shell排序(插入升级版)//快速排序/*平均时间 O(nlogn) 最坏情况 O(n2) 辅助空间O(logn)*/void QuickSort(int []);void QSort(int [],int low,int high);int Partition1(int [],int low,int high);//算法1int Partition2(int [],int low,int high);//算法2//合并排序/*平均时间 O(nlogn) 最坏情况 O(nlogn) 辅助空间O(n)*/void MergeSort(int []);void MSort(int [],int [],int ,int );void Merge(int [],int [],int ,int ,int);//选择排序void SelectSort(int []);int SelectMinKey(int [],int);//堆排序void HeapSort(int []);void HeapAdjust(int [],int,int);void main(){int number[MAX];InsertSort(number);BInsertSort(number);ShellSort(number);QuickSort(number);MergeSort(number);SelectSort(number);HeapSort(number);}void RandNumber(int number[]){int i;srand(time(NULL));printf("排序前:");for(i=0;i<MAX;++i){number[i] = rand()%100;printf("%d ",number[i]);}printf("\n");}void PrintNumber(int number[]){int i;printf("排序后:");for(i=0;i<MAX;++i){printf("%d ",number[i]);}printf("\n");}void InsertSort(int number[]){int i,j,temp;printf("-------------插入排序---------------\n");RandNumber(number);for(i=1;i<MAX;++i){temp = number[i];for(j=i-1;temp <number[j]&&j>-1;--j){number[j+1] = number[j];}number[j+1] = temp;}PrintNumber(number);}void BInsertSort(int number[]){int i, j, temp;int low, high ,mid;printf("-------------折半排序---------------\n");RandNumber(number);for(i=1;i<MAX;++i){temp = number[i];low = 0;high = i-1;while(low <= high){mid = (low+high)/2;if(temp < number[mid])high = mid -1;elselow = mid +1;}for(j=i-1;j>high;--j)number[j+1] = number[j];number[j+1]= temp;}PrintNumber(number);}void ShellSort(int number[]){int i,j,k,gap;int temp;printf("-------------Shell排序---------------\n");RandNumber(number);for(gap=MAX/2;gap>0;gap=gap/2){for(k=0;k<gap;++k){for(i=k+gap;i<MAX;++i){temp = number[i];for(j=i-gap;temp<number[j]&&j>=k;j-=gap){number[j+gap] = number[j];}number[j+gap] = temp;}}}PrintNumber(number);}void QuickSort(int number[]){printf("------------快速排序---------------\n");RandNumber(number);QSort(number,0,MAX-1);PrintNumber(number);}void QSort(int number[],int low,int high){if(low<high){int prvotloc = Partition1(number,low,high);QSort(number,low,prvotloc-1);QSort(number,prvotloc+1,high);}}int Partition1(int number[],int low,int high){int temp = number[low];while(low<high){while(low<high&&temp<=number[high])--high;SWAP(number[low],number[high]);while(low<high&&temp>=number[low])++low;SWAP(number[low],number[high]);}return low;}int Partition2(int number[],int low,int high){int l = low;while(low<high){if(number[high]>=number[low]){SWAP(number[l],number[low]);++l;}++low;}SWAP(number[l],number[high]);return l;}void MergeSort(int number[]){printf("------------合并排序---------------\n");RandNumber(number);MSort(number,number,0,MAX-1);PrintNumber(number);}void MSort(int sr[],int number[],int s,int t){if(s==t)number[s]=sr[s];else{int tr[MAX];int m = (s+t)/2;MSort(sr,tr,s,m);MSort(sr,tr,m+1,t);Merge(tr,number,s,m,t);}}/**合并讲tr[s...m]和tr[m+1...t]合并到number[s.....t]*/void Merge(int tr[],int number[],int s,int m,int t){int k;int i = m+1;for(k=s;k<=t;++k){if(s<=m&&i<=t){if(tr[s]>tr[i]) number[k]=tr[i++];else number[k]=tr[s++];}else{if(s<=m)number[k]=tr[s++]; if(i<=t)number[k]=tr[i++];}}}void SelectSort(int number[]){int i;int j;printf("------------选择排序---------------\n");RandNumber(number);for(i=0;i<MAX;++i){j = SelectMinKey(number,i);if(i!=j)SWAP(number[i],number[j]);}PrintNumber(number);}int SelectMinKey(int number[],int i){int min;int j;min = i;for(j=i;j<MAX;++j){if(number[min]>number[j])min = j;}return min;}void HeapSort(int number[]){printf("-------------堆排序----------------\n");RandNumber(number);int i;for(i=MAX/2-1;i>=0;--i)HeapAdjust(number,i,MAX-1);for(i=MAX-1;i>0;--i){SWAP(number[0],number[i]);HeapAdjust(number,0,i);}PrintNumber(number);}void HeapAdjust(int number[],int i,int nLength){int nChild;for(;2*i+1<nLength;i=nChild){nChild = 2*i+1;if(nChild<nLength-1&&number[nChild+1]>number[nChild])++nChild;if(number[nChild]>number[i]){SWAP(number[i],number[nChild]);}elsebreak;}}
0 0
- 数据结构 排序算法 (插入、快速、Shell、堆、合并)
- 排序算法(插入排序、shell排序、冒泡排序、选择排序、合并排序、堆排序、快速排序、计数排序、基数排序、桶排序)
- 基础排序算法总结(插入、选择、冒泡、合并、二分查找、堆排序、快速排序、基数排序、桶排序、计数排序)
- 数据结构-排序算法详解(插入排序,希尔排序,堆排序,归并排序,快速排序,桶式排序)
- 经典排序算法的实现(选择,插入,shell,堆,快速,归并排序)
- 插入排序,合并排序,堆排序,快速排序,计数排序的实现(算法导论)
- 算法有插入排序,堆排序,合并排序,快速排序和stooge排序
- 数据结构6-排序算法(直接插入排序、希尔排序、快速排序、归并排序和堆排序)
- 排序算法复习(Java实现):插入,冒泡,选择,Shell,快速排序, 归并排序,堆排序,桶式排序,基数排序
- 七大排序算法(冒泡,选择,插入,二分法排序,希尔,快速,合并,堆排序)的java实现
- 排序算法C++11实现——冒泡、选择、插入、希尔、堆、合并、快速排序(非递归)
- 经典排序算法设计与分析(插入排序、冒泡排序、选择排序、shell排序、快速排序、堆排序、分配排序、基数排序、桶排序、归并排序)
- 经典排序算法设计与分析(插入排序、冒泡排序、选择排序、shell排序、快速排序、堆排序、分配排序、基数排序、桶排序、归并排序)
- 插入排序、合并排序、堆排序和快速排序
- 数据结构与算法:七种排序算法总结(冒泡排序、选择排序、直接插入排序、希尔排序、堆排序、归并排序、快速排序)
- C语言实现基本排序算法----排序(直接插入排序,SHELL排序,冒泡排序,快速排序,简单选择排序,堆排序)
- 七大排序算法(冒泡,选择,插入,二分法排序,希尔,快速,合并,堆排序)的java实现(14/8/3更新加入二分排序)
- 数据结构与算法从零开始系列:冒泡排序、选择排序、插入排序、希尔排序、堆排序、快速排序
- Java练习:tips.Print
- Linux命令用到一个记录一个
- 【Java类集】_LinkedList类笔记(实例亲测)
- 堆栈的作用,应用和用途
- 岁月的剪影【十月再不动就发霉了】
- 数据结构 排序算法 (插入、快速、Shell、堆、合并)
- android微信首页切换界面
- Mysql之细枝末节,你知道多少
- Documentation目录下binfmt_misc文档的翻译
- HDU 1018 求阶乘的位数
- pushlet给特定用户,分组,群发推送消息(新手亲测,解决新手使用遇到的困难!)
- 【Java类集】_Set接口笔记(实例亲测)
- Python快速入门
- 【Java类集】_排序及重复元素说明笔记(实例亲测)