排序算法
2015-09-12 14:53
239 查看
1 冒泡排序
2. 快速排序
3. 堆排序
5. 希尔排序
6. 归并排序
/* * 冒泡排序 */ #include <stdio.h> #define ARRAYLEN 6 void BubbleSort(int a[],int n) { int i,j,t; for(i=0;i<n-1;i++) { for(j=n-1;j>i;j--) { if(a[j-1]>a[j]) { t=a[j-1]; a[j-1]=a[j]; a[j]=t; } } printf("第%2d遍:",i+1); for(j=0;j<n;j++) printf("%d ",a[j]); printf("\n"); } } void BubbleSort1(int a[],int n) { int i,j,t,flag=0; //flag用来标记是否发生交换 for(i=0;i<n-1;i++) { for(j=n-1;j>i;j--) { if(a[j-1]>a[j])//交换数据 { t=a[j-1]; a[j-1]=a[j]; a[j]=t; flag=1; } } printf("第%2d遍:",i+1); for(j=0;j<n;j++) printf("%d ",a[j]); printf("\n"); if(flag==0) //没发生交换,直接跳出循环 break; else flag=0; } } int main() { int i; int a[6] = {5,6,7,15,43,62}; printf("原数据:"); for(i=0;i<ARRAYLEN;i++) printf("%d ",a[i]); printf("\n"); BubbleSort(a,ARRAYLEN); printf("排序后:"); for(i=0;i<ARRAYLEN;i++) printf("%d ",a[i]); printf("\n"); return 0; }
2. 快速排序
/** 快速排序 **/ #include <stdio.h> #include <iostream> #define ARRAYLEN 5 int Division(int a[], int left, int right) { int base = a[left]; while (left<right) { while(left < right && a[right] > base ) --right; a[left] = a[right]; while(left < right && a[left]< base) ++left; a[right] = a[left]; } a[left] = base; return left; } void QuickSort(int a[], int left, int right) { int i; if(left < right) { i = Division(a,left,right); QuickSort(a,left,i-1); QuickSort(a,i+1,right); } } int main() { int i; int a[5] = {20,40,50,10,60}; printf("原数据:"); for(i=0;i<ARRAYLEN;i++) printf("%d ",a[i]); printf("\n"); QuickSort(a,0,ARRAYLEN-1); printf("排序后:"); for(i=0;i<ARRAYLEN;i++) printf("%d ",a[i]); printf("\n"); return 0; }
3. 堆排序
/* * * 堆排序 */ #include <stdio.h> #include <iostream> #define ARRAYLEN 5 void HeapAdjust(int a[],int s, int n); void HeapSort(int a[], int n); using namespace std; int main() { int i; int a[5] = {20,40,50,10,60}; printf("原数据:"); for(i=0;i<ARRAYLEN;i++) printf("%d ",a[i]); printf("\n"); HeapSort(a,ARRAYLEN); printf("排序后:"); for(i=0;i<ARRAYLEN;i++) printf("%d ",a[i]); printf("\n"); return 0; } // 注意数组长度 n 与 a[i] 序号的关系 void HeapAdjust(int a[], int s, int n) { int child,temp; while( 2*s+1 < n) //存在左孩子 2*s+1 表示左子节点的序号 节点s有右子树 { child = 2*s+1; //左子树 if( (child+1) <n ) //存在右孩子 2*s+2 表示右子节点的序号 < n 存在 { if(a[child] < a[child+1]) //找s的孩子中最大的。 child = child + 1; } if(a[s]<a[child]) //调整s与孩子的关系,使符合堆 需要调整 { temp = a[s]; a[s] = a[child]; a[child] =temp; s = child; //调整往下进行 } else break; } } void HeapSort(int a[], int n) { int i,temp; for(i=n/2-1; i>=0;i--) { HeapAdjust(a,i,n); } for(i= n-1; i>0; i--) { cout<<a[0]<<endl; temp = a[0]; a[0] = a[i]; a[i] = temp; HeapAdjust(a,0,i); } }4. 直接插入排序
/* 直接插入排序 * */ #include<stdio.h> #include<iostream> using namespace std; #define ARRAYLEN 5 //需要排序的数据元素数量 void InserSort(int a[], int n) { int i,j; int temp; for(i=1; i<n; i++) { temp = a[i]; j = i-1; while((j>=0) && temp < a[j] ) { a[j+1] = a[j]; j = j-1; } a[j+1] = temp; } } int main() { int i; int a[5] = {20,40,50,10,60}; printf("原数据:"); //输出生成的随机数 for(i=0;i<ARRAYLEN;i++) printf("%d ",a[i]); printf("\n"); InserSort(a,ARRAYLEN); //调用插入排序函数 printf("排序后:"); for(i=0;i<ARRAYLEN;i++) //输出排序后的结果 printf("%d ",a[i]); printf("\n"); return 0; }
5. 希尔排序
/* 希尔排序 */ #include<stdio.h> #include<string.h> #include<iostream> #define ARRAYLEN 5 //需要排序的数据元素数量 using namespace std; void ShellSort(int a[], int n) { int i,j,gap; for(gap=n/2; gap>0; gap/=2) // { for(i=1; i<n; i++) { int temp = a[i]; j = i-gap; while((j>=0) && (a[j] > a[i] )) { a[j+gap] = a[j]; j = j-gap; } a[j+gap] = temp; } } } int main() { int i; int a[5] = {20,40,50,10,60}; printf("原数据:"); //输出生成的随机数 for(i=0;i<ARRAYLEN;i++) printf("%d ",a[i]); printf("\n"); ShellSort(a,ARRAYLEN); //调用希尔排序函数 printf("排序后:"); for(i=0;i<ARRAYLEN;i++) //输出排序后的结果 printf("%d ",a[i]); printf("\n"); return 0; }
6. 归并排序
/* 归并排序 */ #include <stdlib.h> #include <iostream> #include <stdio.h> #include <string.h> using namespace std; #define ARRAYLEN 5 //需要排序的数据元素数量 void MergeSort(int a[], int n); void MergePass(int a[], int r[], int n, int len); // a-->r void MergeStep(int a[], int r[], int start_i, int end_1, int end_2); void MergeSort(int a[], int n) { int *p; int gap = 1; int flag = 1; if(!(p = (int*)malloc(sizeof(int)*n))) { exit(0); } while(gap<n) { if(flag) { MergePass(a,p,n,gap); //flag =1 时, a-->p } else { MergePass(p,a,n,gap); //flag =0 时, p-->a } flag = 1-flag; //flag 互换 gap = gap*2; } if(!flag) { for(int i=0; i<n; i++) { a[i] = p[i]; } } } /* * a[] * r[] 存放位置 * n a的长度 * len a里面已排序块大小 */ void MergePass(int a[], int r[], int n, int len) // a-->r { int start = 0 ; while(start + len < n) //至少有两个有序段 可以合并 { int end = start + 2*len -1; //对块的后一块的位置 if(end >=n) //对块的后一块不足len end = n-1; MergeStep(a, r, start, start+len-1, end); // a-->r start = end + 1; // start = start + len } if(start < n) //还剩一个有序段,将其从A中复制到R中 for(; start<n; start++) r[start]=a[start]; } /** * @brief MergeStep 将a[start_i,end_i] 合并到r * @param a * @param r * @param start_i a的对块的第一块起点 a存在对块,则必定第一块最长 * @param end_i a的对块的第一块终点 * @param end a的对块的第二块结束点 */ void MergeStep(int a[], int r[], int start_i, int end_1, int end_2) { int start_a = start_i; // a的对块的第一块起点 int start_r = start_i; // r的对块的第一块起点 int start_a_2 = end_1 + 1; // 第一对块的第二块的起始位置 while(start_a <= end_1 && start_a_2 <= end_2) //对块有一个分块合并完就可以结束 { if(a[start_a] <= a[start_a_2]) { r[start_r++] = a[start_a++]; } else r[start_r++] = a[start_a_2++]; } while(start_a <= end_1) //左分块剩余 { r[start_r++] = a[start_a++]; } while(start_a_2 <= end_2 ) //右分块剩余 { r[start_r++] = a[start_a_2++]; } } int main() { int i; int a[5] = {20,40,50,10,60}; printf("原数据:"); //输出生成的随机数 for(i=0;i<ARRAYLEN;i++) printf("%d ",a[i]); printf("\n"); MergeSort(a,ARRAYLEN); //调用合并排序函数 printf("排序后:"); for(i=0;i<ARRAYLEN;i++) //输出排序后的结果 printf("%d ",a[i]); printf("\n"); return 0; }
相关文章推荐
- AppManager类,管理Activity和App
- block传值
- 大数的除法 不使用BigInteger Java实现
- 用liferay实现的增删改查例子-book管理系统
- vijos P1059积木城堡
- java的继承和接口
- 基于 Node-red实现opencv边缘检测节点
- Java 内部类
- Android常用工具类总结
- 关于性能优化
- 关于java中的异常问题 1
- IOS中如何异步加载图片(一)封装自己的ImageDownLoad类
- PresentViewController切换界面
- PHP相关文件操作函数和jquery.Form文件上传
- CATransition
- Linux 系统安全 及 lnmp 安装
- Android Material Design Library系列教程(二)
- Leetcode53: Maximum Depth of Binary Tree
- mitkPlanarFigure类
- 轻量级Java开源日志组件--ahct.log.JLogger