七大排序

来源:互联网 发布:哪个搜索软件好 编辑:程序博客网 时间: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)基数排序:不需要比较关键字的大小,而是根据关键字的各个位的数值来比较的。通过对排序的若干个元素进行‘分配’,收集。

基数排序是另外一种比较有特色的排序方式,它是怎么排序的呢?我们可以按照下面的一组数字做出说明:121041379

1)按个位数排序是121310479

2)再根据十位排序104791213

3)再根据百位排序791213104

这里注意,如果在某一位的数字相同,那么排序结果要根据上一轮的数组确定,举个例子来说:0709在十分位都是0,但是上一轮排序的时候09是排在07后面的;同样举一个例子,1213在十分位都是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;}


0 0
原创粉丝点击