排序算法
来源:互联网 发布:土木转金融 知乎 编辑:程序博客网 时间:2024/06/14 03:38
稳定的排序算法
冒泡排序、插入排序、归并排序和基数排序
不稳定排序算法
选择排序、快速排序、希尔排序、堆排序
插入排序 O(n*n)
直接插入排序的算法思路:
(1) 设置监视哨r[0],将待插入纪录的值赋值给r[0];
(2) 设置开始查找的位置j;
(3) 在数组中进行搜索,搜索中将第j个纪录后移,直至r[0].key≥r[j].key为止;
(4) 将r[0]插入r[j+1]的位置上。
private static void insertSort(int[] arr) { int len = arr.length; for (int i = 1; i < len; i++) { int key = arr[i], j; for (j = 0; j <= i && arr[i] > arr[j]; j++) ; if (i != j) { for (int k = i; k >= j + 1; k--) { arr[k] = arr[k - 1]; } arr[j] = key; } } }
冒泡排序 O(n*n)
冒泡排序算法的运作如下:(从后往前)
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。[1]
private static void swap(int a[], int x, int y) { int tmp = a[x]; a[x] = a[y]; a[y] = tmp; } private static void bubbleSort(int[] arr) { int len = arr.length; for (int i = 0; i < len - 1; i++) { for (int j = i; j < len - 1; j++) if (arr[j] > arr[j + 1]) { swap(arr, j, j + 1); } } }
快速排序 O(log2(n)*n)
void QuickSort(int begin,int end){ int i=begin,j=end; if(begin<end) { temp=b[begin]; while(i!=j) { while(j>i && b[j]>=temp) j--; b[i]=b[j]; while(i<j && b[i]<=temp) i++; b[j]=b[i]; } b[i]=temp; QuickSort(begin,i-1); QuickSort(i+1,end); }}
选择排序 O(n*n)
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
private static void selectSort(int[] arr) { int len = arr.length; for (int i = 0; i < len - 1; i++) { int pos = i; for (int j = i; j < len; j++) { if (arr[j] < arr[pos]) { pos = j; } } if (pos != i) { int tmp = arr[i]; arr[i] = arr[pos]; arr[pos] = tmp; } } print(arr); }
希尔排序 O(n^1.2)
public class Main { private static void print(int a[]){ for(int i=0;i<a.length;i++){ System.out.print(a[i]+" "); } System.out.println(); } public static void main(String[] args) { int a[]={592,401,874,141,348,72,911,887,820,283}; int gap=a.length/2; while(gap>=1){ for(int i=0,j=0;(j=i+gap)<a.length;i++){ if(a[i]>a[j]){ int tmp=a[i]; a[i]=a[j]; a[j]=tmp; } } gap>>=1; } print(a); }}
堆排序 O(log2(n)*n)
#include <iostream>#include <algorithm>using namespace std;//若想升序,则建立最大堆//若想降序,则建立最小堆void print(int a[],int n){ for(int i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl;}void MaxHeapAdjust(int a[],int start,int end)//start,end //本函数进行调整,使H[start~end]成为一个最大堆{ for(int i=2*start+1;i<=end;i*=2) { if(i+1<=end && a[i]<a[i+1]) i++;//子节点中最大的节点 if(a[i]<a[start]) break; //a[start]>=a[i],将a[start]上移 swap(a[start],a[i]); start=i; }}void MinHeapAdjust(int a[],int start,int end)//start,end //本函数进行调整,使H[start~end]成为一个最小堆{ for(int i=2*start+1;i<end;i*=2) { if(i+1<end && a[i]>a[i+1]) i++;//子节点中最大的节点 if(a[i]>a[start]) break; //a[start]<=a[i],将a[start]上移 swap(a[start],a[i]); start=i; }}void HeapSort(int a[],int n){ for(int i=n/2;i>=0;i--)//除了最后一层的节点,不断从底至上构建最大堆 MaxHeapAdjust(a,i,n); //MinHeapAdjust(a,i,n); for(int i=n-1;i>0;i--) { swap(a[0],a[i]);//将最大的元素沉底 MaxHeapAdjust(a,0,i-1);//重新调整最大堆 //MinHeapAdjust(a,0,i-1); }}int main(){ int a[]={2,9,7,6,5,8}; HeapSort(a,6); print(a,6); return 0;}
内排序和外排序
内排序:指在排序期间数据对象全部存放在内存的排序。
外排序:指在排序期间全部对象太多,不能同时存放在内存中,必须根据排序过程的要求,不断在内,外存间移动的排序。
内排序又可分为插入排序、选择排序、交换排序、归并排序及基数排序等几大类。
外排序:在数据量大的情况下,只能分块排序,但块与块间不能保证有序。外排序用读/写外存的次数来衡量其效率。外归并排序
0 0
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 4421: [Cerc2015] Digit Division|组合数学
- C# region的作用
- Layouts - LinearLayout
- PowerDesigner打开时提示“打印错误”
- hdu 2150- Pipe-解析几何
- 排序算法
- Linux基础——常用命令
- 深入浅出 ES6:ES6 与 Babel / Broccoli 的联用
- tableViewHeader预留空白处理
- 翻译 Cg Program in Unity - 2.2 Transparency (1)
- lzg_ad: 构建一个包含FBWF的Windows Embedded Standard 7镜像
- android消除锯齿原理分析
- Android框架设计模式(一)——Template Methods
- using System.Diagnostics 可以制作一个定时器