七大排序
来源:互联网 发布:哪个搜索软件好 编辑:程序博客网 时间:2024/04/24 02:47
5、七大排序:
(1)A:直接插入排序->相当于是从一个数字开始插入,如果要插入的数字k大于已经排好序的序列,直接插在序列末尾,如果小于,则找到满足k<arr[j]的最后一个位置位置j,将从j开始的数字往后移动一位,将k插在j的后面。
B:折半插入排序:在插入 A[i]时,A[0]......A[i-1],已经按照顺序排好,让A[i]与排好序列的中间A[mid]值比较,然后看属于那一部分,进行插入排序。
C:希尔排序(缩小增量法排序,分组插入排序):对所有相隔gap位置的元素进行插入排序,后缩小增量,知道gap=1。初始值一般为序列的一半。
(2):A:冒泡排序:从后往前冒泡。
B:快速排序(冒泡排序的一种改进):如果不多于1个数据,直接返回。一般选择序列最左边的值作为支点数据。将序列分成2部分,一部分都大于支点数据,另外一部分都小于支点数据。对两边利用递归排序数列。
(3)选择排序A:直接选择排序:就是每一次从无序序列选择最小的放到有序序列的租后。形成有序序列。
B:堆排序,在输出堆顶的最小值之后,使得剩余n-1个元素的序列又重建成一个堆,执行上步,即叫做堆排序。
堆的存储:一般用数组表示堆,若根结点在序号零处,则结点的父节点下标为(i-1)/2,结点的左右孩子结点为2*i+1,2*i+2。(注意:若根节点是从下标1开始,则左右孩子结点分别是2*i,2*i+1)。
堆排序的实现:若想得到升序,则建立大顶堆,若想得到降序,则建立小顶堆。
http://www.cnblogs.com/mengdd/archive/2012/11/30/2796845.html
(4)归并排序:进行logn趟归并,归并长度由1到最大值,从而实现排序。
(5)基数排序:不需要比较关键字的大小,而是根据关键字的各个位的数值来比较的。通过对排序的若干个元素进行‘分配’,收集。
基数排序是另外一种比较有特色的排序方式,它是怎么排序的呢?我们可以按照下面的一组数字做出说明:12、104、13、 7、 9
(1)按个位数排序是12、13、104、7、9
(2)再根据十位排序104、7、9、12、13
(3)再根据百位排序7、9、12、13、104
这里注意,如果在某一位的数字相同,那么排序结果要根据上一轮的数组确定,举个例子来说:07和09在十分位都是0,但是上一轮排序的时候09是排在07后面的;同样举一个例子,12和13在十分位都是1,但是由于上一轮12是排在13前面,所以在十分位排序的时候,12也要排在13前面。
http://blog.csdn.net/feixiaoxing/article/details/6876831
下面是一个总的表格,大致总结了我们常见的所有的排序算法的特点。
排序法
平均时间
最差情形
稳定度
额外空间
备注
冒泡
O(n2)
O(n2)
稳定
O(1)
n小时较好
交换
O(n2)
O(n2)
不稳定
O(1)
n小时较好
选择
O(n2)
O(n2)
不稳定
O(1)
n小时较好
插入
O(n2)
O(n2)
稳定
O(1)
大部分已排序时较好
基数
O(logRB)
O(logRB)
稳定
O(n)
B是真数(0-9),
R是基数(个十百)
Shell
O(nlogn)
O(ns) 1<s<2
不稳定
O(1)
s是所选分组
快速
O(nlogn)
O(n2)
不稳定
O(nlogn)
n大时较好
归并
O(nlogn)
O(nlogn)
稳定
O(1)
n大时较好
堆
O(nlogn)
O(nlogn)
不稳定
O(1)
n大时较好
#include "stdafx.h"#include<stdio.h>#include <iostream>#include <malloc.h>using namespace std;voidInsertSort(int arr[],int n);void BinaryInsertSort(int arr[],int n);void ShellInsertSort(int arr[],int n);void BubbleSort(int arr[],int n);voidQuickSort(int arr[],int s,int t);void SelectSort(int arr[],int n);voidHeapSort(int arr[],int n);void Shift(int arr[],int s,int t);voidMergeSort(int arr[],int n);voidMergePass(int arr[],int length,int n);void Merge(int arr[],int low,int mid,int high);int main() { int a[]={4,3,2,1,5,8};int n=sizeof(a)/sizeof(a[1]);for (int k=0;k<n;k++){cout<<a[k];}cout<<endl;//InsertSort(a,n);//BinaryInsertSort(a,n);//ShellInsertSort(a,n);//BubbleSort(a,n);//QuickSort(a,0,n-1);//SelectSort(a,n);//HeapSort(a,n);MergeSort(a,n);for (int k=0;k<n;k++){cout<<a[k];}cout<<endl;return 0; } void InsertSort(int arr[],int n){if (arr==NULL||n<1){return;}int k;int j;for (int i=1;i<n;i++){k=arr[i];j=i-1;while (j>=0&&k<arr[j]){arr[j+1]=arr[j];j--;}arr[j+1]=k;for (k=0;k<n;k++){cout<<arr[k];}cout<<endl;}for (k=0;k<n;k++){cout<<arr[k];}cout<<endl;}void BinaryInsertSort(int arr[],int n){int high;int temp;int low;int j;int mid;for (int i=1;i<n;i++){high=i-1;low=0;temp=arr[i];while (low<=high){mid=(high+low)/2;if (temp<arr[mid]){high=mid-1;}else{low=mid+1;}}for( j=i-1;j>=high+1;j--)arr[j+1]=arr[j];arr[j+1]=temp;for (int k=0;k<n;k++){cout<<arr[k];}}for (int k=0;k<n;k++){cout<<arr[k];}cout<<endl;}void ShellInsertSort(int arr[],int n){int gap=n/2;int i;int temp;int j;while (gap>0){for (i=gap;i<n;i=i+gap){j=i-gap;temp=arr[i];while (j>=0&&temp<arr[j]){arr[j+gap]=arr[j];j=j-gap;}arr[j+gap]=temp;}gap=gap/2;}for (int k=0;k<n;k++){cout<<arr[k];}}void BubbleSort(int arr[],int n){int temp;for (int i=0;i<n;i++){int exchange=0;for (int j=n-1;j>=0;j--){if (arr[j]<arr[j-1]){temp=arr[j];arr[j]=arr[j-1];arr[j-1]=temp;exchange=1;}}if (exchange==0){return;}for (int k=0;k<n;k++){cout<<arr[k];}cout<<endl;}}void QuickSort(int arr[],int s,int t){int temp;int i=s;int j=t;if (s<t){temp=arr[i];while (i!=j){while (j>i&&temp<=arr[j]){j--;}arr[i]=arr[j];while (j>i&&temp>=arr[i]){i++;}arr[j]=arr[i];}arr[i]=temp;QuickSort(arr,s,i-1);QuickSort(arr,i+1,t);}}void SelectSort(int arr[],int n){int min;int temp;for (int i=0;i<n-1;i++){min=i;for (int j=i+1;j<n;j++){if (arr[j]<arr[min]){min=j;}}if (min!=i){temp=arr[min];arr[min]=arr[i];arr[i]=temp;}}}void HeapSort(int arr[],int n){int i;int temp;//建立初始堆for (i=n/2;i>=0;i--){Shift(arr,i,n);for (int k=0;k<n;k++){cout<<arr[k]<<' ';}cout<<endl;}for (i=n-1;i>0;i--){temp=arr[i];arr[i]=arr[0];arr[0]=temp;Shift(arr,0,i-1);}}void Shift(int arr[],int low,int high){int i=low,j=2*i+1;int temp=arr[i];while (j<=high){if (j<high&&arr[j+1]>arr[j]){j++;}if (arr[j]>temp){arr[i]=arr[j];i=j;j=2*i+1;}elsebreak;}arr[i]=temp;}void MergeSort(int arr[],int n){//进行n趟归并排序for (int i=1;i<n;i=2*i){MergePass(arr,i,n);}}void MergePass(int arr[],int length,int n){int i;for (i=0;i+2*length-1<n;i=i+2*length){Merge(arr,i,i+length-1,i+2*length-1);}if (i+length-1<n){Merge(arr,i,i+length-1,n-1);}}void Merge(int arr[],int low,int mid,int high){int *a;int i=low,j=mid+1,k=0;a=new int[high+1-low];//a=(int *)malloc((high-low+1)*sizeof(int));while (i<=mid&&j<=high){if (arr[i]<=arr[j]){a[k]=arr[i];i++;k++;}else{a[k]=arr[j];k++;j++;}}while (i<=mid){a[k]=arr[i];i++;k++;}while (j<=high){a[k]=arr[j];k++;j++;}for (k=0,i=low;i<=high;i++,k++){arr[i]=a[k];}delete []a;}
- 七大排序
- 七大排序
- 七大排序
- 七大排序
- 七大排序算法
- 七大排序算法总结
- 七大经典排序-序
- 七大排序算法
- 七大排序算法
- 七大排序算法
- 七大排序java实现
- 七大排序算法
- 七大排序算法
- 七大比较排序总结
- 七大排序算法代码
- 常见Java七大排序
- 七大排序算法总结
- 七大排序算法
- Android stadio 自定义debug release keystore
- volley网络请求保持sessionID
- Leetcode Word Pattern
- [LC260]Single Number III
- Socket相关函数解析
- 七大排序
- Python 核心编程笔记_Chapter_2 Note_3_赋值与变量_字符串_列表list_元组tuple_字典dict
- iOS直播技术分析与实现
- HDOJ 3430 Shuffling
- Android&&Unity交互——同一个apk
- 大一数据库系统概论期末复习参考
- 欧拉回路
- Java application—SS2.1
- fuel: 安装onos的两种节点选择方式