排序算法
来源:互联网 发布:国民经济数据 编辑:程序博客网 时间:2024/06/06 04:56
1 冒泡排序
/* * 冒泡排序 */#include <stdio.h>#define ARRAYLEN 6void 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 5int 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 5void 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-->rvoid 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;}
0 0
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- Java学习从入门到精通Java Learning Path (一)、工具篇
- vijos P1071新年趣事之打牌
- [随手记]ScrollView嵌套ExpandableListView展开问题
- Spring 定时任务之 @Scheduled cron表达式
- jquery base64 加密解密 request 文本字段传输
- 排序算法
- Android常用工具类总结
- Struts2的分页处理
- SSM框架整合例子
- IOS - 定时器
- C++的sort函数逆序排序
- Java实例入门
- 轻量级Java开源日志组件--ahct.log.JLogger
- spray-can的初识