排序

稳定性

内部排序,内存,逐步扩大有序记录

外部排序

排序过程的依据不同原理:插入,交换,选择,归并,基数o(d.n)

插入类,交换类,选择类,归并

插入类:在R[1...I-1].KEY<=R【i】。key<R[j+1.........i-1].key;

将R【j+1。。。。。i-1】中的所有记录·后移一个位置;

将R【】插入(复制)到R

排序算法评价时间开销和空间开销

时间还与最好,最坏

直接插入排序:最好的情况是比较次数n-1,移动次数为0次

最坏情况:·递减有序比较次数(n+2)(n-1)/2

移动次数(n+4)(n-1)/2

顺序插入排序

折半插入排序

for(i=2;i<=length;i++){

for(i=2;i<=L.length;++i){

Lr[0]=L.r[i];//将L。r[i]暂存在L。r[0]

在L。r[1.....i-1]中折半查找插入位置(high+1);

for(j=i-1;j<high+1;--j)

L.r[j+1]=L..r[j]

L.R【high+1】=L。r【0】;

low=1;high=i-1;

while(low<=high)

{

m=(low<=high){

m=(low+high)/2

if(L.R[0].KEY<L.R[M].KEY)

HIGH=m-1;

else low=m+1;

}

}

}

}

希尔排序

void shellInset(Sqlist&L,int dk)

for(i=dk+1;i<=n;++i)

if(L.r[i].key<L.r[i-dk].key){

L.r[0]=L.r[i];

for(j=i-dk;j>0&&(L.r[0].key<L.r[j].key);j-=dk)

L.r[j+dk]=L.r[j];

L.r[j+dk]=L.r[0];

}

shellinsert

for(k=0;k<t;++k)

  shellinsert(L,dlta[k])

对待排序先宏观后微观

将个记录分成d个子序列

表插入排序

交换排序包含冒泡排序和快排

void bubblesort(Elem R[],int n)

{

for(i=1;i<n;i++)

  for(j=1;j<=n-j:j++)

if(R[j].key>R[j+1].key)

     {Swap(R[j],R[j+1]}

}

}

改进版本

void bubblesort(Elem R[],int n){

i=n;flag=1;

while((i>1)&&flag){

flag=0;

for(j=1;j<i:)

}

}

优化

记住本趟最后一个以后都是有序的

冒泡排序的最好比较次数n-1,移动

最坏次数是移动3n

快排:

枢轴52,49,80,36,14,58,61,97,23,75

23,49,14,36,52,58,61,97,80,75

 1 int Partition(RedType &R[],int low,int high)
 2 pivotkey =R[low].key;
 3 while(low<high){
 4   while(low<high&&R[high].key>=pivotkey)
 5   --high;
 6  R[low]<-->R[high];
 7  while(low<high&&R[low].key<=pivotkey)
 8 ++low;
 9 }
10 return low;//返回枢轴所在位置
11 }
12 
13 
14 
15 
16 }

时间复杂度o(nlogn)

如果初始状态是按关键字有序为o(n^2)

选择排序

简单选择排序

无序序列中找到最小的放到ai

 1 void SelectSort(Elem R[],int n)
 2 
 3 {
 4 //对记录序列R【1.。。n】做简单选择排序
 5 for(i=1;i<n;++i){
 6 //选择第i小的记录,并交换到位
 7 j=SelectMinKey(R,i);
 8 //在R【i。。。n】中选择关键字最小的记录
 9 if(i!=j)R[i]<-->R[j];
10 /与第i个记录交换
11 }
12 
13 
14 }

对n个记录进行比较次数n(n-1)/2

移动最少0,最多3(n-1)

树形选择排序

从根到顶,将最小的改成正无穷

时间复杂度nlogn

空间复杂度增加

堆排序

堆的定义:
小顶堆大顶堆

左右子孩子都小于根是大顶堆。

堆顶元素是最大值(大顶堆)

堆排序无论最坏最好时间复杂度都为nlogn

归并排序

将两个或两个以上的有序子序列归并为一个有序

1 void Merge(RcdType SR[],RcdType&TR[],int i,int m,int n)
2 for(j=m+1,k=i;i<=m&&j<=n;++k)
3 {
4 if(SR[i]。key《=SR[j]。key) TR[K]=SR[i++];
5 else TR[K]=SR[j++];
6 }
7 ...
8 }

将剩余的SR[I...M]复制到TR

将剩余的SR【j...n】复制到TR

if(i<=m)TR[K...N]=SR[i....m];
if(j<=n)TR[K....N]=SR[j..n];

2路归并

第一趟、

时间复杂度o(NLogn)空间O(N)

基数排序

链式基数排序(分配收集)分别按各位,十位百位排序,是稳定的

比较的多个关键字MSD或者LSD

数字0-9

,

当一个男人不再对你啰嗦,不再缠着你,不再没事找你,对你说话也客气了,也不再气你了。那么恭喜你,你已经成功的失去了他。别嫌弃男人幼稚,那是他喜欢你,爱你。女人说男人像小孩子一样不成熟,可又有谁知道,男人在自己喜欢的女人面前才像小孩子,如果不喜欢你了,不爱你了,他比你爸还成熟。
原文地址:https://www.cnblogs.com/fengtangjiang/p/11464940.html