数据结构——排序-创新互联
目录
建昌网站建设公司成都创新互联,建昌网站设计制作,有大型网站制作公司丰富经验。已为建昌近1000家提供企业网站建设服务。企业网站搭建\成都外贸网站制作要多少钱,请找那个售后服务好的建昌做网站的公司定做!个人观点:
排序的概念:
排序的稳定性:
内排序与外排序:
概念:
排序用到的结构与函数:
代码:
最简单排序的实现:
举例:
代码:
时间复杂度:
冒泡排序:
举例:
代码:
时间复杂度:
在优化:
举例:
代码:
简单选择排序:
思想:
代码:
时间复杂度:
直接插入排序:
举例:
代码:
时间复杂度:
希尔排序:
分析:
举例:
推荐视频:
代码:
注意:
堆排序:
堆定义;
举例:
基本思想:
举例:
代码:
归并排序:
算法思想:
理解图解:
举例:
分析一下它的合并操作是如何进行的:
代码实现:
快速排序:
算法思想:
举例:
代码:
个人观点:
(仅代表个人)
对于我初学者来讲,排序这个章节我们注重的思想而不是用法(个人看法而言,因为我刷题量很少,对我来说sort现在够用),那么我们就先注重这些算法的内容思想。
排序的概念:排序的稳定性:通俗来讲就是相同的关键字,在排序之后,它们的前后关系不会变
举例
内排序与外排序: 概念:内排序是在整个排序过程中,待排序的所有记录全部被放置在内存中。
外排序是由于排序记录个数过多,不能同时防止在内存中,整个排序过程需要在内外存之间多次数据交换才能进行
对于内排序性能而言:
(1)时间性能
(2)辅助空间
(3)算法复杂性
内排序分为插入排序、交换排序、选择排序和归并排序
排序用到的结构与函数: 代码:#includeusing namespace std;
const int N=1e3+10;
int n;
typedef struct{
int res[N];
int len=0;
}Sqlist;
void swaq(Sqlist*L,int i,int j){
int temp=L->res[i];
L->res[i]=L->res[j];
L->res[j]=temp;
}
int main(){
Sqlist L;
cin>>n;
for(int i=1;i>L.res[i];
L.len++;
}
cout<
最简单排序的实现:它的基本思想就是相邻两两比较,有冒泡思想但不是冒泡排序
举例:下标从1开始
代码:#includeusing namespace std;
const int N=1e3+10;
int n;
typedef struct{
int res[N];
int len;
}Sqlist;
void swaq(Sqlist*L,int i,int j){
int temp=L->res[i];
L->res[i]=L->res[j];
L->res[j]=temp;
}
void BubbleSort0(Sqlist*L){
for(int i=1;i<=L->len;i++){
for(int j=1;j<=L->len;j++){
if(L->res[i]>L->res[j])
swaq(L,i,j);
}
}
}
int main(){
Sqlist L;
cin>>n;
for(int i=1;i>L.res[i];
L.len++;
}
for(int i=1;i<=L.len;i++)cout<
时间复杂度:时间复杂度高,O(n^2)
冒泡排序: 举例:
从后往前交换,则必定会把相对小的数向前移动,时间复杂度提高了
代码:#includeusing namespace std;
const int N=1e3+10;
int n;
typedef struct{
int res[N];
int len;
}Sqlist;
void swaq(Sqlist*L,int i,int j){
int temp=L->res[i];
L->res[i]=L->res[j];
L->res[j]=temp;
}
void Bubblesort(Sqlist*L){
for(int i=1;ilen;i++){
for(int j=L->len-1;j>=i;j--){
if(L->res[j]>L->res[j+1])
swaq(L,j,j+1);
}
}
}
int main(){
Sqlist L;
cin>>n;
for(int i=1;i>L.res[i];
L.len++;
}
Bubblesort(&L);
for(int i=1;i<=L.len;i++){
cout<
时间复杂度:O(n^2),但是相对来说总归有优化
在优化: 举例:代码:
#includeusing namespace std;
const int N=1e3+10;
int n;
typedef struct{
int res[N];
int len;
}Sqlist;
void swaq(Sqlist*L,int i,int j){
int temp=L->res[i];
L->res[i]=L->res[j];
L->res[j]=temp;
}
void Bubblesort(Sqlist*L){
for(int i=1;ilen;i++){
bool flag=1;
for(int j=L->len-1;j>=i;j--){
if(L->res[j]>L->res[j+1])
swaq(L,j,j+1);
flag=0;
}
if(flag)
break;
}
}
int main(){
Sqlist L;
cin>>n;
for(int i=1;i>L.res[i];
L.len++;
}
Bubblesort(&L);
for(int i=1;i<=L.len;i++){
cout<
简单选择排序:
思想:与冒泡排序差不多,只不过不是遇见小的就交换,而是每次循环遇到最小的才交换
代码:#includeusing namespace std;
const int N=1e3+10;
int n;
typedef struct{
int res[N];
int len;
}Sqlist;
void swaq(Sqlist*L,int i,int j){
int temp=L->res[i];
L->res[i]=L->res[j];
L->res[j]=temp;
}
void Selectsort(Sqlist*L){
int j,mn;
for(int i=1;ilen;i++){
mn=i;
bool flag=0;
for(j=i+1;j<=L->len;j++){
if(L->res[mn]>L->res[j]){
mn=j;
flag=1;
}
}
if(flag)
swaq(L,i,mn);
}
}
int main(){
Sqlist L;
cin>>n;
for(int i=1;i>L.res[i];
L.len++;
}
Selectsort(&L);
for(int i=1;i<=L.len;i++){
cout<
时间复杂度:O(n^2),但是相对于冒泡排序,总归有一定的优化
直接插入排序: 举例:此时哨兵(L.res[0])就起到了作用
代码:#includeusing namespace std;
const int N=1e3+10;
int n;
typedef struct{
int res[N];
int len;
}Sqlist;
void swaq(Sqlist*L,int i,int j){
int temp=L->res[i];
L->res[i]=L->res[j];
L->res[j]=temp;
}
void Insertsort(Sqlist*L){
int j;
for(int i=2;i<=L->len;i++){
if(L->res[i]res[i-1]){
L->res[0]=L->res[i];
for(j=i-1;L->res[j]>L->res[0];j--)
L->res[j+1]=L->res[j];
L->res[j+1]=L->res[0];
}
}
}
int main(){
Sqlist L;
cin>>n;
for(int i=1;i>L.res[i];
L.len++;
}
Insertsort(&L);
for(int i=1;i<=L.len;i++){
cout<
时间复杂度:O(n^2),但是时间效率更好点
希尔排序: 分析:希尔排序是在直接插入排序上的优化
直接插入排序的最好情况:{2,3,4,5,6},时间复杂度为O(n)
最坏情况:{6,5,4,3,2},时间复杂度为O(n^2)
希尔排序是将一个数组分为若干个子序列,然后各自排序然后合并,实现基本有序
基本有序,就是小的关键字基本在前面,大的关键字基本在后面
采用跳跃式分割策略。。。
举例:推荐视频:排序算法:希尔排序【图解+代码】_哔哩哔哩_bilibili
代码:#includeusing namespace std;
const int N=1e3+10;
int n;
typedef struct{
int res[N];
int len;
}Sqlist;
void shellsort(Sqlist*L){
int i,j,k=0;
int lon=L->len;
do{
lon=lon/3+1;
for(i=lon+1;i<=L->len;i++){
if(L->res[i]res[i-lon]){
L->res[0]=L->res[i];
for(j=i-lon;j>0&&L->res[0]res[j];j-=lon){
L->res[j+lon]=L->res[j];
}
L->res[j+lon]=L->res[0];
}
}
}while(lon>1);
}
int main(){
Sqlist L;
cin>>n;
for(int i=1;i>L.res[i];
L.len++;
}
shellsort(&L);
for(int i=1;i<=L.len;i++){
cout<
注意:增量序列的最后一个增量必须等于1才行
堆排序: 堆定义;其实就是特殊的完全二叉树
举例:大顶堆,所有结点大于其左右孩子结点,小顶堆反之
基本思想:将待排序的序列构造成一个大顶堆。此时整个序列的大值就是堆顶的根结点
将它移走(其实就是将其与堆数组末尾元素交换,此时末尾元素就是大值),然后将剩余的n-1
个序列重新构造一个堆,这样就会得到n个元素中的次大值,反复执行,便能得到一个有序序列
举例:(建树)
代码:归并排序:算法思想:是利用归并的思想实现的排序方法,通俗理解起来就是
对于一个无序的数组,先让子序列为1的序列两两归并,然后让子序列为2的序列两两归并,以此类推
理解图解:举例:分析一下它的合并操作是如何进行的:举例:
代码实现:快速排序: 算法思想:通过一趟排序将待排记录分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后对这两部分继续进行排序,以达到整个序列有序的目的
举例:代码:你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
文章标题:数据结构——排序-创新互联
本文URL:http://cdiso.cn/article/dsegce.html