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