排序算法归类
来源:互联网 发布:javassm开源项目源码 编辑:程序博客网 时间:2024/05/17 09:19
1.直接插入排序
具体做法是:在插入第i个记录时,R1,R2,。。。Ri-1已经排好序了,这时将Ri的关键字ki-1,ki-2。。。。进行比较,从而找到应该插入的位置并将Ri插入,插入位置和他后面的记录向后移。
#include <iostream>#include <stdio.h>using namespace std;int a[123456];int main() { int n; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } int key; for(int i=1;i<n;i++){ key=a[i]; int j=i-1; while(j>=0 && a[j]>key){ a[j+1]=a[j]; j--; } a[j+1]=key; } for(int i=0;i<n;i++){ printf("%d ",a[i]); } printf("\n"); return 0;}
2.冒泡排序
具体做法是:首先将第一个记录关键字与第二个记录的关键字进行比较,若为逆序,则交换两个记录的值,然后比较第二个和第三个的关键字,依次类推,直到第n-1个关键字与第n个关键字比完,上述过程为第一趟排序,最大值被放到了n这个位置,再对前n-1个元素进行第二趟排序,以此类推。
#include <iostream>#include <stdio.h>using namespace std;int a[123456];int main() { int n; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } for(int i=0;i<n;i++){ for(int j=0;j<n-i-1;j++){ if(a[j]>a[j+1]){ swap(a[j],a[j+1]); } } } for(int i=0;i<n;i++){ printf("%d ",a[i]); } printf("\n"); return 0;}
3.简单选择排序
这个就太简单了,原理就不说了
#include <iostream>#include <stdio.h>using namespace std;int a[123456];int main() { int n; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } for(int i=0;i<n;i++){ int pos=i; for(int j=i+1;j<n;j++){ if(a[pos]>a[j]){ pos=j; } } if(i!=pos){ swap(a[i],a[pos]); } } for(int i=0;i<n;i++){ printf("%d ",a[i]); } printf("\n"); return 0;}
4.希尔排序
希尔排序的基本思想:先将整个带排序列分割成若干个子序列,然后分别进行直接插入排序,待整个序列基本有序之后,再对全体记录进行一次直接插入排序。
#include <iostream>#include <stdio.h>#include <string.h>using namespace std;int a[123456];int data[12355];int main() { int n; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } int k=n,h=0; ///////////////////////////////////////////////////////// //从k=n开始,重复k=k/2的运算,将结果存入data种,直到k=1为止 memset(data,0,sizeof(data)); do{ k=k/2; data[h++]=k; }while(k>1); h=0; int dk; while((dk=data[h])>0){ for(int i=data[h];i<n;i++){ if(a[i]<a[i-dk]){ int t=a[i]; int j; for(j=i-dk;j>=0&&t<a[j];j-=dk){ a[j+dk]=a[j]; } a[j+dk]=t; } } h++; } for(int i=0;i<n;i++){ printf("%d ",a[i]); } printf("\n"); return 0;}
5.快速排序
快速排序的基本思想:采用分治的思想,通过一趟排序将原序列分为两个部分,key左边全都小于key,右边全都大于key,然后再分别对左右两部分进行快拍,直到整个序列有序。
#include <iostream>#include <stdio.h>#include <string.h>using namespace std;int a[123456];void QuickSort(int a[],int low,int high) { if(low>=high) { return; } int key,i,j; key=a[low]; i=low; j=high; while(i<j) { while(i<j and a[j]>=key) j--; if(i<j) { a[i++]=a[j]; } while(i<j and a[i]<=key) i++; if(i<j) { a[j--]=a[i]; } } a[i]=key; QuickSort(a,low,i-1); QuickSort(a,i+1,high);}int main() { int n; scanf("%d",&n); for(int i=0; i<n; i++) { scanf("%d",&a[i]); } QuickSort(a,0,n-1); for(int i=0; i<n; i++) { printf("%d ",a[i]); } printf("\n"); return 0;}
6.归并排序:
归并排序的基本思想:将两个或两个以上的有序序列合并为一个
void mergearray(int a[], int first, int mid, int last, int temp[]) { int i = first, j = mid + 1; int m = mid, n = last; int k = 0; while (i <= m && j <= n) { if (a[i] <= a[j]) temp[k++] = a[i++]; else temp[k++] = a[j++]; } while (i <= m) temp[k++] = a[i++]; while (j <= n) temp[k++] = a[j++]; for (i = 0; i < k; i++) a[first + i] = temp[i]; } void mergesort(int a[], int first, int last, int temp[]) { if (first < last) { int mid = (first + last) / 2; mergesort(a, first, mid, temp); mergesort(a, mid + 1, last, temp); mergearray(a, first, mid, last, temp); } } bool MergeSort(int a[], int n) { int *p = new int[n]; if (p == NULL) return false; mergesort(a, 0, n - 1, p); delete[] p; return true; }
堆排序和基数排序的代码我就不会了
下面是几种排序的表
阅读全文
0 0
- 排序算法归类
- 几种排序算法归类
- 常见排序算法--实现(归类)
- 排序算法稳定性和不稳定性归类
- 路由算法归类
- STL算法归类
- 算法的简单归类
- 深度学习算法归类
- 数据结构面试之十二——排序3(排序算法归类、排序时间、空间复杂度、稳定性总结)
- 图像处理基础算法归类
- 机器学习算法的归类
- 归类
- 查找和排序方法归类----C和C++
- 网页模糊归类算法的应用与实现(转载)
- 图像配准方面的一些算法归类
- 数学之美:GOOGLE新闻归类算法与余弦定理
- 图像配准方面的一些算法归类
- 图像配准方面的一些算法归类
- AtCoder 2370 Piling
- Unbuntu16.04+Kaldi本地运行timit语料(完整版)
- 野(wild)指针与悬空(dangling)指针
- 稳定婚姻问题
- python 使用list和tuple
- 排序算法归类
- c++实现基本栈和队列
- 如何用JavaScript代码编写拖拽
- some tips about python Three
- jsp+Javabean+servlet实现添加删除
- 【博览网】设计模式——第二周课程笔记
- java中synchronized关键字的用法
- 关于mysql的单机多实例方案
- 面试准备