排序算法

1.冒泡排序

#include<iostream>
using namespace std;
int main() {
  int n, a[100];
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  for (int i = 1; i < n; i++) {
    for (int j = 0; j < n-i; j++) {
      if (a[j+1] < a[j]) {
        swap(a[j+1], a[j]);
      }
    }
  }
  for (int i = 0; i < n; i++) {
    cout << a[i] << " ";
  }
} 


2.选择排序
 

for(int i = 1; i < n; i++) {
  for (int j = i+1; j < n- 1; j++) {
    if (a[i] < a[j]) {
      swap (a[i], a[j]);
    }
  }
} 

 

3.插入排序

for(int i = 1; i < n; i++) {
  for (int j = i; j > 0; j--) {
    if (a[j] < a[j-1]) {
      swap (a[j], a[j-1]);
    }
    else {
      break;
    }
  }
} 


4.希尔排序
  { 8 9 1 7 2 3 5 4 6 0 } 
a.初始增量为 gap = 10/2 = 5,整个数组分成了 5 组
【 8 , 3 】,【 9 , 5 】,【 1 , 4 】,【 7 , 6 】,【 2 , 0 】
b.  {3 5 1 6 0 8 9 4 7 2}    gap = 5/2 = 2;
【 3 , 1 , 0 , 9 , 7  】,【 5 , 6 , 8 , 4 , 2  】

对这分开的 2 组分别使用插入排序
{0  1  3  7  9} ,   { 2  4  5  6  8}
c.再缩小增量 gap = 2/2 = 1,整个数组分成了 1 组,合并成为

【 0, 2 , 1 , 4 , 3 , 5 , 7 , 6 , 9 , 8 】
d. 在用插入排序进行得 0 1 2 3 4 5 6 7 8 9


5.快速排序

#include<iostream>
using namespace std;
int a[100], n;
void quicksort(int l, int r) {
  int i, j, t, base;
  if (l > r) 
    return;
  base = a[l];
  i = l;
  j = r;
  while (i != j) {
    while (a[j] >= base && i < j) 
    j--;
    while (a[i] <= base && i < j)
    i++;
    if (i < j) {
      t = a[i];
      a[i] = a[j];
      a[j] = t;
    }
  }
  a[l] = a[i];
  a[i] = base;
  quicksort(l, i-1);
  quicksort(i+1, r);
}
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  quicksort(0, n-1);
  for (int i = 0; i < n; i++) {
    cout << a[i] << " ";
  }
} 

20    40    50    10   60   
left                           right
a.base = 20 (参照物)
b,从数组right位置向前找,找到比base小的数(交换)
10  40  50  10  60
c.从数组的left位置向后找,一直找到比(base)大的数,
10  40  50  40  60
d.重复“第二,第三“步骤,直到left和right指针重合,
    、最后将(base)插入到40的位置,
      此时数组值为: 10,20,50,40,60,至此完成一次排序。
e. quickSort(a,left,i-1);/*递归左边*/
   quickSort(a,i+1,right);/*递归右边*/
6.归并排序

#include<iostream>
using namespace std;
int a[100], n;
void merge(int l,int r,int mid) {
  int aux[r-l+1], i,  j;
  for(int k = l; k <= r; k++)
    aux[k-l]=a[k];
  i = l;
  j = mid+1;
  for(int k = l;k <= r; k++) {
    if(i > mid) {
      a[k] = aux[j-l];
       j++;
     }
     else if(j > r) {
       a[k] = aux[i-l];
       i++;
      }
     else if(aux[i-l]>aux[j-l]) {
        a[k] = aux[j-l];
         j++;
      }
      else {
          a[k] = aux[i-l];
          i++;
         }
    }        
}
void merge_sort(int l,int r) {
    if(l >= r) return;
      int mid = (l+r) / 2;
      merge_sort(l, mid);
      merge_sort(mid+1, r);
      merge(l, r, mid);        
}
void mergesort(int l,int r) {
    merge_sort(l, r-1);
} 
int main() {
    cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  mergesort(0, n);
  for (int i = 0; i < n; i++) {
    cout << a[i] << " ";
  }
 }

自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法);
自下而上的迭代;首先,将数字分割成两片区域
再将数字分割成两片区域依次划分直到每片区域只有一个元素分割完成
接下来,将分割的每片区域进行合并组合,合并时,按照数字的升序移动,使得合并后的数字在组内按升序排列
  当合并包含多个数字的组时,比较开头的数字,移动其中较小的数字
递归的重复组的合并操作,直到所有数字都在一个组中。
完成 归并排序 和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是 O(nlogn) 的时间复杂度。代价是需要额外的内存空间。
7.桶排序
  桶排序(Bucket sort)是一种基于计数的排序算法,工作的原理是将数据分到有限数量的桶子里,然后每个桶再分别排序
堆排序

 

#include<iostream>
using namespace std;
int a[100], n;
void maxheap_down(int start, int end) {
  int c = start;
  int l = 2*c + 1;//左孩子 
  int tmp = a[c];//节点
  for (; l <= end; c = l, l = 2*l+1) {
    if (l < end && a[l] < a[l+1]) 
      l++;
    if (tmp >= a[l]) 
      break;
    else {
      a[c] = a[l];
      a[l] = tmp;
    }
  } 
}
void heap_sort_asc() {
  for (int i = n/2-1; i >= 0; i--) 
    maxheap_down(i, n-1);
  for (int i = n-1; i > 0; i--) {
    swap(a[0], a[i]);
    maxheap_down(0, i-1);
  }
}
int main() {
    cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  heap_sort_asc();
  for (int i = 0; i < n; i++) {
    cout << a[i] << " ";
  }
 }


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值