问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C语言排序算法一共多少种

发布网友 发布时间:2022-04-19 23:35

我来回答

1个回答

热心网友 时间:2022-06-13 03:44

选择排序

#include <iostream>
using namespace std;
void select_sort(int arr[], int num);
void output_array(int arr[], int num);
int main()
{
    int a[10];
    for(int i=0; i<10; i++)
    {
        cin>>a[i];
    }
    select_sort(a,10);
    output_array(a,10);
    return 0;
}
void select_sort(int array[],int n) //形参array是数组名
{
    int i,j,k,t;
    for(i=0; i<n-1; i++)
    {
        k=i;  //先设第i个就为最小
        for(j=i+1; j<n; j++)
            if(array[j]<array[k])
                k=j;   //通过循环,得到k为最小
        t=array[k];    //交换a[i]和a[k]
        array[k]=array[i];
        array[i]=t;
    }
    return;
}
void output_array(int arr[], int num)
{
    int i;
    for(i=0; i<num; i++)
    {
        cout<<arr[i];
        cout<<endl;
    }
    return;
}

2.冒泡排序

#include<stdio.h>
int main()
{
int i,j,a[10],t;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<10;i++)
for(j=i+1;j<10;j++)
if(a[i]>a[j])
{
t=a[j];
a[j]=a[i];
a[i]=t;
}
for(i=0;i<10;i++)
printf("%d ",a[i]);
return 0;
}

3.堆排序

#include<iostream>
using namespace std;
void  paii(int a[20],int i,int m)
{
int k,t;    
t=a[i]; 
k=2*i+1;    
while (k<m)    
{        
if ((k<m-1)&&(a[k]<a[k+1])) 
k++;   
if (t<a[k]) 
{
a[i]=a[k]; 
i=k; 
k=2*i+1;
}        
else break; 
}    
a[i]=t;
}
void ipai(int a[20], int n)  
{
int i,k; 
for (i=n/2-1;i>=0;i--) 
paii(a,i,n);     
for (i=n-1; i>=1; i--)    
{  
k=a[0]; 
a[0]=a[i]; 
a[i]=k;  
paii(a,0,i);    
}}
int main() 
{  
int a[10],i; 
for(i=0;i<10;i++)  
cin>>a[i];
ipai(a,10); 
for(i=0;i<10;i++)
cout<<a[i]<<endl;
}

4.快速排序

#include<iostream>
using namespace std;
void Quicksort(int a[],int low,int high)
{
    if(low>=high)
    {
        return;
    }
    int first=low;
    int last=high;
    int key=a[first];
    while(first<last)
    {
while(first<last&&a[last]>=key)
            --last;
        a[first]=a[last];
        while(first<last&&a[first]<=key)
            ++first;
        a[last]=a[first];
}
    a[first]=key;
    Quicksort(a,low,first-1);
    Quicksort(a,last+1,high);
}


int main()
{
    int i,a[100],x,n=0;
while(cin>>x)
{
a[n]=x;
n++;
}
n--;
Quicksort(a,0,n);
for(i=0;i<=n;i++)
cout<<a[i]<<" ";
cout<<endl;
    return 0;
}

5. 基数排序

#include <stdio.h>
#include <stdlib.h>
int main(){
int data[10]={73,22,93,43,55,14,82,65,39,81};        //对十个数进行排序
int temp[10][10]={0};        //构造一个临时二维数组,其值为0
int order[10]={0};        //构造一维数组,其值为0
int i,j,k,n,lsd;
k=0;n=1;
for (i=0;i<10;i++) printf("%d ",data[i]);         //在排序前,对这10个数打印一遍
putchar('\n');
while (n<=10){
for (i=0;i<10;i++){
lsd=((data[i]/n)%10);         //lsd先对个位取余,然后再对十位取余,注意循环
temp[lsd][order[lsd]]=data[i];        //temp[3][0]=73,temp[2][0]=22,temp[3][1]=93,temp[3][2]=43,⋯⋯
order[lsd]++;        //需要区分的是lsd和order[lsd],这两个不是一样的概念嗷
}
printf("\n重新排列: ");
for (i=0;i<10;i++){
if(order[i]!=0)
for (j=0;j<order[i];j++){


data[k]=temp[i][j];
printf("%d ",data[k]);
k++;
}
order[i]=0;
}
n*=10; //第二次用十位
k=0;
}
putchar('\n');
printf("\n排序后: ");
for (i=0;i<10;i++) printf("%d ",data[i]);
return 0;
}

6.希尔排序

#include<iostream>
using namespace std;
void shell_sort(int a[],int n);
int main()
{
    int n,a[10000];
    cin>>n;
    for(int y=0;y<n;y++)
        cin>>a[y];
    shell_sort(a, n);
      for(int i=0; i<n; i++)
          cout<<a[i]<<" ";
      cout<<endl;
}

void shell_sort(int a[], int n)
{
    int gap,k,temp;//定义增量;
    for(gap = 3; gap >0; gap--)//设置初始增量,递减;
    {
        for(int i=0; i<gap; i++)//按增量分组;
        {
            for(int j = i+gap; j<n; j=j+gap)//每组分别比较大小;
            {
                if(a[j]<a[j-gap])
                {
                    temp = a[j];
                    k = j-gap;
while(k>=0&&a[k]>temp)
                    {
                        a[k+gap] = a[k];
                        k = k-gap;
                    } 

                   a[k+gap] = temp;
                }
            }
        }
    }
}

7.归并排序

#include<iostream>
using namespace std;
void MergeSort(int p[],int s,int m,int t)
{
     int q[100];                        //q[100]用来存放排好的序列
 int i=s;
 int j=m+1;
 int k=s;
while(i<=m&&j<=t)
 {
 if(p[i]<=p[j])
 q[k++]=p[i++];
 else
 q[k++]=p[j++];
 }
 if(i<=m)
 while(i<=m)
 q[k++]=p[i++];
 else while(j<=t)
 q[k++]=p[j++];
 for(int n=s;n<=t;n++)
             p[n]=q[n];
}
 void Merge(int p[],int s,int t)
 {
 if(s<t)
 {
 int m=(s+t)/2;  //将数组分成两半
 Merge(p,s,m);//递归拆分左数组
 Merge(p,m+1,t);//递归拆分右数组
 MergeSort(p,s,m,t);//合并数组
     }
 }
 int main()
 {
     int n;
 int p[100];
 cin>>n;
  for(int i=0; i<n; i++)
         cin>>p[i];
 Merge(p,0,n-1);
 for(int j=0;j<n;j++)
 cout<<p[j]<<" ";
 cout<<endl;
 return 0;
 }

排序方法基本就这些,还有双向冒泡这种拓展的排序方法,还有直接排序如桶排序

追问什么叫双向冒泡,七种排序哪一种最快

追答双向冒泡是对冒泡排序的一种改进,冒泡排序在顺序越乱的情况下越慢,因为它要交换很多次,双向冒泡在处理大量混乱的数据时比冒泡快一些。
每一种排序适合的地方不同,所以速度不一,一般情况下快速排序最快

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
企业培训学到了什么 培训感悟简短 有关培训的感悟 通过培训学到什么 培训你学到了什么 领导问培训学到什么怎么回复 Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 数据结构C语言——实现各种排序算法 c语言三种排序 c语言各种排序算法 c语言中排序方法 佳能6d如何连接手机传照片 教你如何用佳能单反相机连接手机传图方法! 请问佳能d3500如何将照片传到手机? 手机和佳能相机怎么连接 佳能750d怎么连接手机传照片? 佳能相机5d的图片怎么上传到手机? 佳能相机怎么连接手机拍照 单反相机连接手机传照片 有没有电脑处理器型号等级表? 1800国家体系认证 什么是国际标准体系认证?主要包括哪些认证呢? ISO9000,ISO14000,ISO18000有什么区别啊?高手来指... 关于14000,18000体系的认证 ISO9001,ISO14001,ISO18000什么意思 iso18000标准是什么意思? 职业健康安全管理体系认证证书为什么是18000 关于c语言几种排序方法的理解 c语言排序算法 使用C语言编程实现排序算法 用C语言编程实现快速排序算法 C语言中最常用的排序方法有哪些? C语言冒泡排序法是什么? C语言排序的方法 裸求C语言的各种排序算法,插入法,选择法,2分查... C语言实现七种排序算法的演示代码是什么? 基于C语言的几种排序算法的分析 C语言,排序算法 c语言做各种排序算法比较程序怎么做? c语言的两种排序? C语言排序 哈尔滨离职后公积金怎么提取 在哈尔滨工作离职后,怎么提取自己的公积金 离职后,在哈尔滨提取住房公积金需要哪些手续? 哈尔滨如果离职后,公积金提取流程如何 哈尔滨提取公积金需要哪些资料,本人已经离职,没... (哈尔滨)原单位离职住房公积金封存后,我是否可...