各种常用的排序算法实现对数组的排序——整理总结(代码实现)
来源:互联网 发布:怎么弄公司企业域名 编辑:程序博客网 时间:2024/06/05 22:42
冒泡排序、插入排序、折半排序(二分插入排序)、快速排序、选择排序、归并排序、希尔排序、堆排序
#include <stdio.h> #include <algorithm>#include <iostream>using namespace std;//冒泡排序 void bubble_sort(int a[],int n) { int i,j; for(i = 0;i < n-1; i++) { bool exchange = false; for(j = n-1;j > i; j--) { if(a[j-1] > a[j]) { exchange = true; swap(a[j-1], a[j]); } } if(exchange == false) break; } } //直接插入排序void insert_sort(int a[],int n) { int i,j; for(i = 1;i < n; i++) { int t = a[i]; for(j = i; j > 0 && a[j-1] > t; j--) a[j] = a[j-1]; a[j] = t; } } //折半排序、二分插入排序 //实现1 void Insert_sort(int *pArr, int len) { // 定义二分法插入排序的函数 int temp, low, up; // temp用于存放插入值, low表示下界, up表示上界 for (int i = 1; i < len; i++) { temp = pArr[i]; // 保存插入值 low = 0; // 下界肯定为0 up = i - 1; // 上界就是除去插入值剩余元素的最大下标 while (low <= up) { // 当up移动到low左侧时,结束循环。注意,此处一定要带有等号,否则排序会失败,可以举例说明 if (temp > pArr[(low+up)/2]) low = (low + up)/2 + 1; // 当插入值大于中间值,将下界移动到中界+1的位置 else up = (low + up)/2 - 1; // 当插入值小于中间值,将上界移动到下界-1的位置 } // 对low和up处理使得在决定好插入位置后up在low之前以跳出循环 for (int j = i-1; j >= low; j--) // 该循环起到将元素后移的作用 pArr[j+1] = pArr[j]; pArr[low] = temp; // 将插入值插入 } return;}void InsertSort_find(int X, int *pArr, int low, int up) { if (up < low){ printf("Can't find X\n"); return; } int mid = (up + low)/2; if (X == pArr[mid]) { printf("The index is %d\n", mid); return; } else if (X < pArr[mid]) { InsertSort_find(X, pArr, low, mid-1); } else { InsertSort_find(X, pArr, mid+1, up); }} //实现2void BinaryInsertSort(int *a, int n) { int i,j,k,low,high,m; for(i = 1; i < n; i++) { low = 0; high = i - 1; while(low <= high) { m = (low + high) / 2; if(a[m] > a[i]) high = m - 1; else low = m + 1; } if(j != i - 1) { int temp = a[i]; for(k = i - 1; k >= high + 1; k--) a[k + 1] = a[k]; a[k + 1] = temp; } } } //快速排序void quick_sort(int a[],int l,int r) { if(l >= r) return; int i,j,p; i = l-1, j = r; p = l + rand()%(r-l); swap(a[p],a[r]); p = a[r]; while(1) { do { i++; } while(a[i] < p && i < r); do { j--; } while(a[j] > p && j > l); if(i >= j) break; swap(a[i], a[j]); } swap(a[i], a[r]); quick_sort(a, l, i-1); quick_sort(a, i+1, r); } //选择排序void select_sort(int a[],int n) { int i,j; for(i = 0; i < n-1; i++) { int min = i; for(j = i+1; j < n; j++) { if(a[j] < a[min]) min = j; } if(min != i) swap(a[i], a[min]); } } //堆排序void heap_siftdown(int a[],int n,int p) //调整算法 { int i = p,j = i*2+1; int tmp = a[i]; while(j < n) { if(j+1 < n && a[j] < a[j+1]) j++; if(a[j] <= tmp) break; else { a[i] = a[j]; i = j;j = j*2+1; } } a[i] = tmp; } void heap_sort(int a[],int n) { int i; for(i = (n-1)/2; i >= 0;i--) heap_siftdown(a, n, i); for(i = n-1;i >= 0; i--) { swap(a[i], a[0]); heap_siftdown(a, i, 0); } } //希尔排序void shell_pass(int a[],int n,int inc) //inc为1时,其实就是直接插入排序 { int i,j; for(i = inc; i < n; i++) { int t=a[i]; for(j = i;j >= inc && a[j-inc] > t; j-= inc) a[j] = a[j-inc]; a[j] = t; } } void shell_sort(int a[],int n) { int i = n; do{ i = i/3 + 1; shell_pass(a, n, i); }while(i > 1); } //归并排序void merge(int a[],int b[],int l,int m,int r) { int i,j,k; for(i = l; i <= r; i++) b[i] = a[i]; i = l; j = m+1; k = l; while(i <= m && j <= r) { if(b[i] <= b[j]) a[k++] = b[i++]; else a[k++] = b[j++]; } while(i <= m) a[k++] = b[i++]; while(j <= r) a[k++] = b[j++]; } void merge_sort(int a[],int b[],int l,int r) { if(l >= r) return; int m = (l+r)/2; merge_sort(a, b, l, m); merge_sort(a, b, m+1, r); merge(a, b, l, m, r); }
阅读全文
0 0
- 各种常用的排序算法实现对数组的排序——整理总结(代码实现)
- Java基础学习总结(28)——Java对各种排序算法的实现
- Java对各种排序算法的实现
- Java对各种排序算法的实现
- Java对各种排序算法的实现
- python实现的各种排序算法代码
- 各种排序算法的实现代码
- python实现的各种排序算法代码
- 各种排序算法的c++代码实现
- 各种排序算法的总结和实现。
- 常用的各种排序算法(C语言实现)
- 常用排序算法的具体代码实现
- java的各种排序算法代码整理
- 各种排序算法的实现
- 各种排序算法的实现
- 各种排序算法的实现
- 各种排序算法的实现
- 各种排序算法的实现
- 数据挖掘RapidMiner工具使用----产品介绍与安装过程
- hdu2844—Coins(多重背包)
- Spring1 Bean实例化
- angularjs指令中的compile与link函数详解
- spring2 bean作用域 和 生命周期
- 各种常用的排序算法实现对数组的排序——整理总结(代码实现)
- JVM的内存模型
- $GLOBALS['HTTP_RAW_POST_DATA'] 和$_POST的区别
- java 中获取各种路径
- Spark Streaming
- 徐飞玉:自然语言理解及其应用学习笔记
- eclipse出现的问题
- 给Bean的属性赋值的好方法
- ARM的串口配置