数据结构之排序

1.排序的分类

在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的;若具有相同关键字的记录之间的相对次序发生变化,则称这种排序方法是不稳定的。






































稳定的排序 时间复杂度   空间复杂度
冒泡排序 最差和平均是O(n2),最好是O(n)    1 
双向冒泡排序 最差和平均是O(n2),最好是O(n)  1
插入排序 最差和平均是O(n2),最好是O(n)   1
归并排序  最差、平均、最好都是O(nlogn) O(n) 
桶排序  O(n) O(k) 
基数排序  O(dn)(d是常数) O(n) 
二叉树排序  O(nlogn) O(n) 
图书馆排序  O(nlogn)

(1+e)n






















不稳定的排序 时间复杂度 空间复杂度
选择排序 最差和平均是O(n2),最好是O(n) 1
希尔排序 O(nlogn) 1
堆排序 最差、平均、最好都是O(nlogn) 1
快速排序 平均O(nlogn),最差是O(n2) O(nlogn)

2.常见排序算法分析:

1.冒泡法

冒泡法就是第一个数开始,不断地和后面地数比较,大的数往后,一轮后最大的数跑到最后;为了使序列在正序列前提下,能减少排序的次数,需要用一个BOOL型变量来判断是否发生了交换


 1 #include<iostream>
2 using namespace std;
3
4
5 void sort(int a[],int n)
6 {
7 int i,j,temp;
8 bool exchange;
9 for(i=0;i<n-1;i++)
10 {
11 exchange = false;
12 for(j=0;j<n-i-1;j++)
13 {
14 if(a[j+1]<a[j])
15 {
16 temp = a[j+1];
17 a[j+1] = a[j];
18 a[j] = temp;
19 }
20 exchange = true;
21 }
22 if(!exchange)
23 return;
24 }
25 }
26
27
28
29 int main()
30 {
31 int a[] = {13,31,45,26,78,56,90,24,15,81};
32 sort(a,10);
33 for(int i=0;i<10;i++)
34 cout<<a[i]<<‘ ‘;
35 cout<<endl;
36 return 0;
37 }

2.直接插入法

注意用while来实现寻找插入的位置,减少辅助变量


 1 #include<iostream>
2 using namespace std;
3
4
5 void sort(int a[],int n)
6 {
7 int i,j;
8 for(i=1;i<=n-1;i++)
9 {
10 j = i-1;
11 int temp = a[i];
12 while(temp<a[j])
13 {
14 a[j+1]=a[j];
15 j--;
16 }
17 a[++j]=temp;
18 }
19 }
20
21
22
23 int main()
24 {
25 int a[] = {13,31,45,26,78,56,90,24,15,81};
26 sort(a,10);
27 for(int i=0;i<10;i++)
28 cout<<a[i]<<‘ ‘;
29 cout<<endl;
30 return 0;
31 }

数据结构之排序,布布扣,bubuko.com

时间: 2024-10-17 07:44:48

数据结构之排序的相关文章

《C算法.第1卷,基础、数据结构、排序和搜索(第三版)》pdf

下载地址:网盘下载 内容简介  · · · · · · <C算法>介绍了当今最重要的算法,共分3卷,<C算法(第1卷):基础.数据结构.排序和摸索>是第1卷.第1卷分4部分.共16章.第一部分"基础知识"(第1-2章)介绍了基本算法分析原理.第二部分"数据结构"(第3-5章)讲解算法分析中必须掌握的数据结构知识.主要包括基本数据结构.抽象数据结构.递归和树.第三部分"排序"(第6-11章)按章节顺序分别讨论了基本排序方法(

数据结构-各类排序算法总结[结局]

各类排序算法总结 五.分配类排序->基数排序: 基数排序是一种借助于多关键码排序的思想,是将单关键码按基数分成"多关键码"进行排序的方法.基数排序属于"低位优先"排序法,通过反复进行分配与收集操作完成排序. 对于数字型或字符型的单关键字,可以看成是由多个数位或多个字符构成的多关键字, 此时可以采用这种"分配-收集"的办法进行排序,称作基数排序法.其好处是不需要进行关键字间的比较. 例如:对下列这组关键字{278, 109, 063, 930

Java数据结构与排序

一.引子:想要给ArrayList排序却发现没有排序方法?你有两种选择:        1.换用TreeSet:     2.使用Collection.sort(List<T> list) / Collection.sort(List<T> list, Comparator<? super T> c)方法. 二.展开分析Java的几种主要数据结构及其排序方法: LinkedList 高效操作元素 TreeSet  不重复,有序 HashSet 不重复,快速查找 Hash

数据结构-各类排序算法总结[续]

各类排序算法总结 三.交换类排序[接上] 2.快速排序 快速排序是通过比较关键码.交换记录,以某个记录为界(该记录称为支点),将待排序列分成两部分.其中,一部分所有记录的关键码大于等于支点记录的关键码,另一部分所有记录的关键码小于支点记录的关键码.我们将待排序列按关键码以支点记录分成两部分的过程,称为一次划分.对各部分不断划分,直到整个序列按关键码有序. 如果每次划分对一个元素定位后,该元素的左侧子序列与右侧子序列的长度相同,则下一步将是对两个长度减半的子序列进行排序,这是最理想的情况! [算法

数据结构—各类‘排序算法’实现(上)

数据结构中的排序算法分为比较排序,非比较排序.比较排序有插入排序.选择排序.交换排序.归并排序,非比较排序有计数排序.基数排序.下面是排序的具体分类: 1.直接排序 主要思想:使用两个指针,让一个指针从开始,另一个指针指向前一个指针的+1位置,两个数据进行比较 void InsertSort(int* a, size_t size) {      assert(a);      for (size_t i = 0; i < size - 1; i++)      {           int 

数据结构-各类排序算法总结

各类排序算法总结 一. 排序的基本概念 排序(Sorting)是计算机程序设计中的一种重要操作,其功能是对一个数据元素集合或序列重新排列成一个按数据元素某个项值有序的序列. 有 n 个记录的序列{R1,R2,-,Rn},其相应关键字的序列是{K1,K2,-,Kn},相应的下标序列为1,2,-,n.通过排序,要求找出当前下标序列1,2,-, n 的一种排列p1,p2, -,pn,使得相应关键字满足如下的非递减(或非递增)关系,即:Kp1≤Kp2≤-≤Kpn,这样就得到一个按关键字有序的记录序列{R

数据结构 - 希尔排序(Shell&amp;#39;s Sort) 具体解释 及 代码(C++)

数据结构 - 希尔排序(Shell's Sort) 具体解释 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24363981 希尔排序(Shell's Sort), 又称"缩小增量排序"(Diminishing Increment Sort), 是插入排序的一种. 主要思想是: 先将整个记录, 通过间隔分成若干个子序列, 分别进行插入排序, 待整个序列基本有序时, 再进行一次插入排序. 由于插入排

Java数据结构 遍历 排序 查找 算法实现

1. 遍历算法(遍历二叉树6种方法) 1.1. 概述 遍历算法针对二叉树而言的,主要有先序.中序.后序三种遍历顺序,三种顺序又分别有递归和常规算法,二叉树遍历的主要思想是:遍历左子树,遍历右子树,访问根节点,由这三者的遍历顺序来确定是先序.中序还是后序.下面只要求掌握递归遍历算法,常规遍历算法见附录一. 1.2. 先序遍历算法 遍历顺序:访问根节点,遍历左子树,遍历右子树.代码如下: void preOrder(BinaryTreeNode bt) { if (bt == null)// 如果当

【数据结构】——排序算法——3.1、选择排序

      [数据结构]--排序算法--3.1.选择排序 一.先上维基的图: 分类 排序算法 数据结构 数组 最差时间复杂度 О(n2) 最优时间复杂度 О(n2) 平均时间复杂度 О(n2) 最差空间复杂度 О(n) total, O(1)auxiliary 二.描述: 选择算法算是最直观的一个了.每次在队列里抽取一个极大(或极小)值进行排列.每次都需要遍历未被抽取的元素队列. 三.Java程序: static void selection_sort(int[] unsorted) { for