七种排序方式总结

2024-06-24 11:38
文章标签 总结 排序 方式 七种

本文主要是介绍七种排序方式总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

/*2018.01.23
*A:YUAN
*T:其中排序算法:冒泡排序,简单排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序
*/#include <stdio.h>
#include <math.h>
#include <malloc.h>#define MAXSIZE 10000
#define FALSE   0
#define TRUE    1typedef struct 
{int r[MAXSIZE];    //用于存储要排序的数组,r[0]作为哨兵或者临时变量int length;        //用于记录顺序表的长度
}SqList;void swap(SqList *L,int i,int j)
{int temp;temp=L->r[i];L->r[i]=L->r[j];L->r[j]=temp;
}//冒泡排序1
void Bubble_Sort0(SqList *L)
{int i,j;int status = TRUE;//以status作为标记,改进增加for(i = 0;i < L->length;i++){status = FALSE;//改进增加//for(j = i+1;j<L->length;j++)//基本冒泡算法for(j = L->length - 1;j>=i;j--)//改进冒泡法{//if(L->r[i]>L->r[j]) //对应基本冒泡算法if(L->r[j]>L->r[j+1])//对应改进冒泡法{swap(L,j,j+1);//交换两者的值status = TRUE;//改进增加}}}}//简单排序法
void Simple_Selection_Sort(SqList *L)
{int i,j,min;for(i = 0;i < L->length;i++){min = i;for(j = i+1;j < L->length;j++){if(L->r[j]<L->r[i]){min = j;}}if(i != min)swap(L,i,min);}
}void Straight_Insertion_Sort(SqList *L)
{int i,j;for(i = 2;i<L->length;i++){if(L->r[i] < L->r[i - 1]){L->r[0] = L->r[i];for(j = i - 1;L->r[j]>L->r[0];j--){L->r[j+1] = L->r[j];}L->r[j+1] = L->r[0];}}
}void Shell_Sort(SqList *L)
{//r[0] 作为哨兵(即缓存)int i,j,parameter;parameter = L->length;do{parameter = parameter/3+1;for(i = parameter + 1;i <= L->length;i++){if(L->r[i] < L->r[i - parameter])//需要将L->r[i] 插入有序增量子表{L->r[0] = L->r[i];for(j = i - parameter;j>0 && L->r[0]<L->r[j];j-=parameter){L->r[j+parameter] = L->r[j];}L->r[j+parameter] = L->r[0];}}}while(parameter > 1);
}//堆排序
void Heap_Ajust(SqList *L,int s,int m)
{int temp,j;temp = L->r[m];for(j = 2*s;j<=m;j*=2){if(j<m && L->r[j] < L->r[j+1])++j;if(temp >= L->r[j])s=j;}L->r[s]=temp;
}void Heap_Sort(SqList *L)
{int i;for(i=L->length/2;i>0;i--){Heap_Ajust(L,i,L->length);}for(i = L->length;i>1;i--){swap(L,1,i);Heap_Ajust(L,1,i-1);}
}//快速排序——此时在它之前(后)的记录均不大于(小)它
int Partitiom(SqList *L,int low,int high)
{int pivotkey;pivotkey = L->r[low];while(low < high){while(low < high && L->r[high]>=pivotkey)high--;swap(L,low,high);while(low < high && L->r[low]<=pivotkey)low++;swap(L,low,high);}return low;
}void QSort(SqList *L,int low,int high)
{int pivot;if(low < high){pivot = Partitiom(L,low,high);//将L->r[low..high]一分为二,算出枢轴值pivotQSort(L,low,pivot - 1);       //对低子表递归排序QSort(L,pivot + 1,high);      //对高子表递归排序}
}void QuickSort(SqList *L)
{QSort(L,1,L->length);
}//归并排序
/*归并排序的归并函数*/  
void Merge(int SR[], int TR[], int i, int middle, int rightend) {//实际上这里的i也就是要排序合并的数组段的左起始点  int j, k, l;  for (k = i, j = middle + 1; i <= middle&&j <= rightend; k++) {  if (SR[i] < SR[j])/*将SR中的元素按小到大的顺序存入TR,只需比较中点两侧对应下标元素大小*/  TR[k] = SR[i++];  else  TR[k] = SR[j++];  }  if (i <= middle) {/*若中点左边元素剩余,将剩余元素并入TR(注意这里并入只要按照顺序即可,因为SR已经排好序了)*/  for (l = 0; l <= middle - i; l++)  TR[k + l] = SR[i + l];  }  if (j <= rightend) {/*若中点右边元素剩余,将剩余元素并入TR*/  for (l = 0; l <= rightend - j; l++)  TR[k + l] = SR[j + l];  }  
}  /*归并排序递归函数*/  
void MSort(int SR[], int TR1[], int s, int t) {  int middle;  int TR2[MAXSIZE + 1];  if (s == t)  TR1[s] = SR[s];  else {  middle = (s + t) / 2;/*将SR分成以middle为界的两部分*/  MSort(SR, TR2, s, middle);/*递归将SR[s,middle]归并为有序的数组TR2*/  MSort(SR, TR2, middle + 1, t);/*递归将SR[middle+1,t]归并为有序的数组TR2*/  Merge(TR2, TR1, s, middle, t);/*将上面的两部分分别有序的TR2归并为总体有序的TR1*/  }  
}  /*总体调用排序函数*/  
void MergeSort(SqList *S) {  MSort(S->r, S->r, 1, S->length);  
} int main(void)
{int i;int temp;
/*//冒泡排序法
#if 0SqList L;L.length = MAXSIZE;temp = L.length;for(i = 0;i<L.length;i++){L.r[i] = temp--;                     //逆序赋值}Bubble_Sort0(&L);                        //冒泡排序法for(i = 0;i<L.length;i++){printf("r[%d] = %d.\n",i,L.r[i]);    //顺序输出}#else
//	SqList *L;//直接定义一个指针是没有指向的,是野指针,程序运行会出错SqList *L=malloc(sizeof(SqList));L->length = MAXSIZE;temp = L->length;for(i = 0;i<L->length;i++){L->r[i] = temp--;                     //逆序赋值}Bubble_Sort0(L);                          //冒泡排序法for(i = 0;i<L->length;i++){printf("r[%d] = %d.\n",i,L->r[i]);    //顺序输出}
#endif*//*//简单排序法SqList L;L.length = MAXSIZE;temp = L.length;for(i = 0;i<L.length;i++){L.r[i] = temp--;                     //逆序赋值}Simple_Selection_Sort(&L);               //简单排序法for(i = 0;i<L.length;i++){printf("r[%d] = %d.\n",i,L.r[i]);    //顺序输出}*//*//直接插入排序算法SqList L;L.length = MAXSIZE;temp = L.length;for(i = 1;i<L.length;i++){L.r[i] = temp--;                     //逆序赋值}Straight_Insertion_Sort(&L);             //直接插入排序法for(i = 1;i<L.length;i++){printf("r[%d] = %d.\n",i,L.r[i]);    //顺序输出}*//*//希尔排序SqList L;L.length = MAXSIZE;temp = L.length;for(i = 0;i<L.length;i++){L.r[i] = temp--;                     //逆序赋值}Shell_Sort(&L);                          //希尔排序for(i = 0;i<L.length;i++){printf("r[%d] = %d.\n",i,L.r[i]);    //顺序输出}*/
/*//堆排序示例SqList L;L.length = MAXSIZE;temp = L.length;for(i = 0;i<L.length;i++){L.r[i] = temp--;                     //逆序赋值}Heap_Sort(&L);                           //堆排序for(i = 0;i<L.length;i++){printf("r[%d] = %d.\n",i,L.r[i]);    //顺序输出}*//*//快速排序示例SqList L;L.length = MAXSIZE;temp = L.length;for(i = 0;i<L.length;i++){L.r[i] = temp--;                     //逆序赋值}QuickSort(&L);                           //快速排序for(i = 0;i<L.length;i++){printf("r[%d] = %d.\n",i,L.r[i]);    //顺序输出}*///归并排序SqList L;L.length = MAXSIZE;temp = L.length;for(i = 0;i<L.length;i++){L.r[i] = temp--;                     //逆序赋值}printf("before sort.\n");MergeSort(&L);                           //归并排序for(i = 0;i<L.length;i++){printf("r[%d] = %d.\n",i,L.r[i]);    //顺序输出}
}

这篇关于七种排序方式总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1090043

相关文章

gradle第三方Jar包依赖统一管理方式

《gradle第三方Jar包依赖统一管理方式》:本文主要介绍gradle第三方Jar包依赖统一管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景实现1.顶层模块build.gradle添加依赖管理插件2.顶层模块build.gradle添加所有管理依赖包

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

Spring Boot读取配置文件的五种方式小结

《SpringBoot读取配置文件的五种方式小结》SpringBoot提供了灵活多样的方式来读取配置文件,这篇文章为大家介绍了5种常见的读取方式,文中的示例代码简洁易懂,大家可以根据自己的需要进... 目录1. 配置文件位置与加载顺序2. 读取配置文件的方式汇总方式一:使用 @Value 注解读取配置方式二

MySQL重复数据处理的七种高效方法

《MySQL重复数据处理的七种高效方法》你是不是也曾遇到过这样的烦恼:明明系统测试时一切正常,上线后却频频出现重复数据,大批量导数据时,总有那么几条不听话的记录导致整个事务莫名回滚,今天,我就跟大家分... 目录1. 重复数据插入问题分析1.1 问题本质1.2 常见场景图2. 基础解决方案:使用异常捕获3.

JAVA保证HashMap线程安全的几种方式

《JAVA保证HashMap线程安全的几种方式》HashMap是线程不安全的,这意味着如果多个线程并发地访问和修改同一个HashMap实例,可能会导致数据不一致和其他线程安全问题,本文主要介绍了JAV... 目录1. 使用 Collections.synchronizedMap2. 使用 Concurren

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)