排序一般分为:插入排序,选择排序,交换排序,归并排序和分配排序。
1.插入排序,基本思想:每次将一个待排序记录按其关键字大小插入到前面已排好序的子文件中的适当位置,直到全部记录插入为止。时间复杂度:O(n^2), 稳定的。
算法描述:
//递增
void insertSort(SeqList R){
int i,j;
for(i=2; i<=n; i++){
if(R[i].key < R[i-1].key){
R[0] = R[i];
j = i-1;
do{
R[j+1] = R[j];
j--;
}while(R[0]<R[j]);
}// end if
}//end for
}
直接插入排序:假设待排序记录存放在数组R[1..N]中,初始时,R[1]自成一个有序区,无序区为R[2..N]。从i=2起直至i=n为止,依次将R[i]插入当前的有序区R[1..i-1],生成含有n个记录的有序区。
一趟直接插入排序:
简单方法:首先在当前有序区R[1..i-1]找出R[i]正确插入位置k,然后将R[k,i-1]均后移一位,腾出k位置插入R[i]。
改进的方法:将待插入的R[i]从右向左依次与有序区R[j]比较,若R[j] > R[i],则R[j]右移一位,若R[j]<=R[i],查找结束,j+1即为R[i]插入位置。
2.希尔排序,也属于插入排序一种。基本思想:先取一个小于n的整数d1,作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组进行直接插入排序;然后,取第二个增量d2<d1重复上述分组和排序,直到所取的增量dt=1,实质是一种分组插入排序。不稳定。
//d 为增量,整体按递增排序
void shellPass(int d, int n){
int i,j;
for(i=d+1; i<=n; i++){
if(R[i] < R[i-d]){
R[0] = R[i];
j = i - d;
do{
R[j+d] = R[j];
j = j - d;
}while(j>0 && R[0] < R[j]);
R[j+d] = R[0];
}//end if
}//end for
}
3.冒泡排序
void bubbleSort(int n){
int i,j,t;
int changed;
for(i=1; i<n; i++){
changed = 0;
for(j=n-1; j>=i; j--){
if(R[j+1] < R[j]){
R[0] = R[j+1];
R[j+1] = R[j];
R[j] = R[0];
changed = 1;
}
}
if(!changed) return;
}
}
4.快速排序,划分交换排序,采用分治的策略。将问题分解为若干个规模更小但结构与原问题相似的子问题,递归地解这些子问题,然后把子问题的解组合为原问题的解。
基本思想:(1)分解,R[low..high]任选一个记录为基准Pivot,划分为左右子区间,并使左边子区间所有记录小于Pivot,右边区间大于等于Pivot。(2)求解。通过递归调用快速排序对左右子区间快速排序。(3)组合。快速排序无需
int partition(int low, int high){
int pivot = R[low];
while(low<high){
while(low<high && R[high]>=pivot){
high--;
}
if(low<high){
R[low++] = R[high];
}
while(low<high && R[low]<=pivot){
low++;
}
if(low<high){
R[high--] = R[low];
}//end while
}
R[low] = pivot;
return low;
}
void quickSort(int low,int high){
int pivotPos;
if(low < high){
pivotPos = partition(low,high);
quickSort(low,pivotPos-1);
quickSort(pivotPos+1,high);
}
}
5.选择排序,基本思想:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排序的子文件最后,直到全部记录排序完毕。常用有直接选择排序和堆排序。
直接选择排序:n个记录的文件的直接选择排序可以经过n-1趟直接选择排序得到有序结果。
void selectSort(int n){
int i,j,k;
for(i=1; i<=n; i++){
k=i;
for(j=i+1; j<=n; j++){
if(R[j] <R[k]){
k=j;
}
if(k!=i){
R[0] = R[i];
R[i] = R[k];
R[k] = R[0];
}
}
}
}
堆排序:
分享到:
相关推荐
一、 实验目的: 1、 掌握直接插入排序、折半插入排序、冒泡排序、快速排序和归并排序等排序算 法的思想。 2、 实现直接插入排序、折半插入排序、冒泡排序...折半插入排序: 比较次数 移动元素次数 排序结果 6,23,45。
数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数...
数据结构是计算机科学中的核心课程之一,而内部排序则是数据结构中的重要组成部分,它涉及到如何高效地对大量数据进行排序。严蔚敏教授的《数据结构》是一本经典的教材,其中第十章专门讲解了内部排序算法。内部排序...
在IT领域,排序是计算机科学中的基础概念,尤其在数据结构和算法的学习中占据着重要地位。本资源“C/C++数据结构_随机10000个数:排序~8大排序代码集.rar”提供了C/C++实现的八种经典排序算法,适合初学者深入理解和...
数据结构:第十章排序.ppt
数据结构课程:排序与二叉树综合实验
数据结构实验 ——排序
数据结构中的基数排序是一种非比较型整数排序算法,它基于数字的位宽进行排序,尤其适用于处理大量相同数字的情况。基数排序的核心思想是将数字按照位数从低位到高位分别进行桶排序,最终得到完全有序的序列。下面将...
本资源“算法:C语言实现第1-4部分基础知识、数据结构、排序及搜索”涵盖了C语言编程的基础知识,以及在计算科学中至关重要的数据结构、排序和搜索算法。 首先,基础知识部分主要涉及C语言的语法、变量、控制结构...
### 数据结构排序实验报告知识点解析 #### 实验背景与目的 - **实验背景**:本实验报告来源于南昌大学科学技术学院信息学科部计算机系的一次专业课程实验。《数据结构》作为一门重要的计算机基础课程,其目的在于...
根据提供的实验报告信息,我们可以详细地探讨数据结构中查找与排序算法的相关知识点,具体包括折半查找、顺序查找、归并排序以及堆排序这四种算法。 ### 一、折半查找 #### 定义与原理 折半查找,也称二分查找,是...
数据结构:第十章 外部排序.ppt
在计算机科学领域,数据结构和排序算法是编程基础的重要组成部分,特别是对于C语言这样底层而强大的编程工具。本文将深入探讨“C语言数据结构内部排序算法及比较”这一主题,结合个人课程作业的经验,对一些核心概念...
数据结构:第十章 排序 (2).ppt
以上是数据结构中关于排序的一些基本知识,包括排序的稳定性、比较次数、内部排序和外部排序的定义,以及直接插入排序、折半插入排序、希尔排序和冒泡排序的原理和特点。这些排序算法各有优缺点,选择哪种排序算法取...
4. **数据结构基础**:排序算法往往与特定的数据结构如数组、链表、栈、队列等紧密相关。理解这些基本数据结构的特性和操作,能帮助设计更高效的排序算法。 5. **团队合作**:四人合作意味着需要明确任务分工,如一...
在IT领域,数据结构与算法是核心组成部分,而排序问题是数据结构中不可或缺的一部分。本主题主要聚焦于数据结构试验中的排序问题,通过C语言来实现内部排序算法。下面将详细介绍这些概念及其相关知识。 首先,数据...
在计算机科学领域,数据结构和排序算法是至关重要的基础,它们直接影响到程序的效率和性能。本资源包“数据结构-各种排序完整示例程序”提供了C语言实现的各种经典排序算法,帮助学习者深入理解并掌握这些算法的实际...
数据结构:第10章 内部排序.ppt