排序算法详解

简介: 排序算法详解

1.快速排序

关于快速排序的逻辑原理是这样的:


将两个指针i,j分别指向表的起始和最后的位置,T为临时变量。


反复操作以下两步:


(1)j逐渐减小,并逐次比较j指向的元素和目标元素的大小,若p(j)<T则交换位置。


(2)i逐渐增大,并逐次比较i指向的元素和目标元素的大小,若p(i)>T则交换位置。


直到i,j指向同一个值,循环结束。


下面是源码

#include <stdio.h>
#include <stdlib.h>
void swap(int A[],int i,int j)
{
  int temp=0;
  if(A[i]>A[j])
  {
  temp=A[j];
  A[j]=A[i];  
  A[i]=temp;    
  } 
}
/* 快速排序 */
void quick_sort(int x[],int left, int right)
{
   int temp = left;
   int i;
   if (left >= right)
        return;
    for (i = left+1; i<= right; i++)
    {
        if(x[i] < x[left])
            swap(x, ++temp, i);
    }
    swap(x, left, temp);
    quick_sort(x,left, temp-1);
    quick_sort(x,temp+1, right);
}
int main()
{
  int number[]={10,9,8,7,6,5,4,3,2,1};
    int i=0,len;
  printf("start ....\n"); 
  len=(int)sizeof(number)/sizeof(*number);
  printf("len =%d\n",len);  
    quick_sort(number,0,9);
  for(i=0;i<10;i++)
  {
   printf("%d ",number[i] );    
  }
     printf("\n");  
     printf("end ....\n");  
  exit(0);
}


代码已经编译调试过了,亲测可行。


2.插入排序

#include <stdlib.h>
#include <stdio.h>
void printf_buf(int* buf, int size)
{
  int i;
  for (i = 0; i < size; i++)
  printf("%d ", buf[i]);
  printf("\r\n");
}
void insert_funs(int *buf, int size)
{
  int  cur;
  int i,j;
  for (i = 1; i < size; i++)
  {
  printf(" %d poll:\r\n",i);
  cur = buf[i];
  for (j = i - 1; j >= 0 && buf[j] > cur; j --)
  {
    buf[j + 1] = buf[j];
  }
  buf[j + 1] = cur;
  printf_buf(buf, size);
  }
  printf("\n");
}
int main(int argc, char* argv)
{
  int num[] = { 14,3,12, 10, 12,1, 5 ,16};
  int i;
  printf("insert funs\r\n");
  insert_funs(num, sizeof(num)/sizeof(num[0]));
  printf("\n");
  return 0;
}


运行:

image.png


3.冒泡排序

#include<stdio.h>
#include<stdlib.h>
void printf_buf(int* buf, int size)
{
  int i;
  for (i = 0; i < size; i++)
  printf("%d ", buf[i]);
  printf("\r\n");
}
void swap(int x[], int i, int j)
{
  int temp = 0;
  if (x[i] > x[j])
  {
  temp = x[i];
  x[i] = x[j];
  x[j] = temp;
  }
}
void BubbleSort(int a[], int len)
{
  int i, j, temp;
  for (j = 0; j < len - 1; j++)
  {
  for (i = 0; i < len - 1 - j; i++)
    swap(a, i, i + 1);
  }
}
int main()
{
  int num[] = { 20, 8, 18, 3, 30, 14, 77, 32 };
  int len = sizeof(num) / sizeof(num[0]);
  int i = 0;
  printf("start:\r\n");
  printf_buf(num, len);
  printf("\n");
  BubbleSort(num, len);
  printf("end:\r\n");
  printf_buf(num, len);
  printf("\n");
  return 0;
}


运行:

image.png


4.选择排序


原理:从所有记录中选出最小的一个数据元素与第一个位置的记录交换;然后在剩下的记录当中再找最小的与第二个位置的记录交换,循环到只剩下最后一个数据元素为止。

#include<stdio.h>
#include<stdlib.h>
void printf_buf(int* buf, int size)
{
  int i;
  for (i = 0; i < size; i++)
  printf("%d ", buf[i]);
  printf("\r\n");
}
//如果下标为i的数大于下标为j的数,交互两个数的位置
void swap(int x[], int i, int j)
{
  int temp = 0;
  if (x[i] > x[j])
  {
  temp = x[i];
  x[i] = x[j];
  x[j] = temp;
  }
}
void selectSort(int num[], int size)
{
  int i, j,minindex;
  for (i; i < size; i++)
  {
  minindex = i;
  for (j = i + 1; j < size; j++)
    if (num[j] < num[minindex])
    minindex = j;
  swap(num, i, minindex);
  }
}
int main()
{
  int num[] = { 20, 8, 18, 3, 30, 14, 77, 32 };
  int len = sizeof(num) / sizeof(num[0]);
  int i = 0;
  printf("start:\r\n");
  printf_buf(num, len);
  printf("\n");
  selectSort(num, len);
  printf("end:\r\n");
  printf_buf(num, len);
  printf("\n");
  return 0;
}


运行

image.png


5.希尔排序


希尔排序就是在一个序列中进行分组(简称:增量),然后对每个分组分别进行插入排序。随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个序列恰好被分成一组,算法便终止。


简单的说希尔排序是插入排序的升级版。

#include<stdio.h>
#include<stdlib.h>
void printf_buf(int* buf, int size)
{
  int i;
  for (i = 0; i < size; i++)
  printf("%d ", buf[i]);
  printf("\r\n");
}
void shellSort(int a[], int n)
{
  int i, j, gap;
  for (gap = n / 2; gap > 0; gap /= 2)
  {
  for (i = 0; i < gap; i++)
  {
    for (j = i + gap; j < n; j += gap)
    {
    if (a[j] < a[j-gap])
    {
      int tmp = a[j];//基数
      int k = j - gap;//标记分组后的下标(j的前一个数据)
      while (k >= 0 && a[k] > tmp)//前一个数大,就交换
      {
      a[k+gap] = a[k];
      k -= gap;//查找前一个值
      }
      a[k + gap] = tmp;
      printf_buf(a, n);
    }
    }
  }
  }
}
int main()
{
  int num[] = { 8, 9, 1, 7, 2,3,5,4,6,0};
  int len = sizeof(num) / sizeof(num[0]);
  int i = 0;
  printf("start:\r\n");
  printf_buf(num, len);
  printf("\n");
  shellSort(num, len);
  printf("end:\r\n");
  printf_buf(num, len);
  printf("\n");
  return 0;
}

image.png

6.堆排序

7.归并排序

8.桶排序

9.计数排序

10.基数排序


目录
相关文章
|
SQL 关系型数据库 MySQL
SQLyog数据导入导出图文教程
SQLyog数据导入导出图文教程
709 0
|
敏捷开发 JavaScript 前端开发
❤❤❤【Vue.js最新版】sd.js基于jQuery Ajax最新原生完整版for凯哥API版本❤❤❤
❤❤❤【Vue.js最新版】sd.js基于jQuery Ajax最新原生完整版for凯哥API版本❤❤❤
|
9月前
|
机器学习/深度学习 XML 监控
使用A10单卡24G复现DeepSeek R1强化学习过程
使用A10单卡24G复现DeepSeek R1强化学习过程
灵码编码搭子新功能
我是一位软件开发工程师,使用通义灵码企业知识库进行代码生成与规范化工作,相比之前效率提升了40%。通过集成企业知识库、智能补全代码、优化代码结构和实时调试,大幅减少了手工编码时间,提高了代码质量和规范一致性。
190 4
|
机器学习/深度学习 人工智能 监控
如何利用AI实现银行存量客户的营销?
金融行业是当今大数据、人工智能应用最广、最深的领域之一。随着数据仓库和数据科学的发展,以银行为代表的金融行业企业拥有了海量数据,应运而生了金融领域的大数据分析、智能营销等大数据和人工智能的应用。其中针对存量客户的智能营销成为银行业的一项重要策略。
|
安全 新能源 数据安全/隐私保护
行级权限登场,向繁琐的视图授权说拜拜
为了解决视图授权和维护繁琐的问题,Dataphin V4.1 推出行级权限功能,支持灵活控制不同账号对计算引擎表的可见范围,帮助统一构建数据基座的企业,实现各子公司、大区、业务部之间的数据隔离。
289 5
|
网络安全 开发工具 git
|
机器学习/深度学习 自然语言处理
基于深度学习的自然语言处理技术在智能客服系统中的应用
【2月更文挑战第21天】随着人工智能技术的不断发展,自然语言处理(NLP)技术在各个领域得到了广泛应用。本文主要探讨了基于深度学习的自然语言处理技术在智能客服系统中的应用。首先介绍了深度学习和自然语言处理的基本概念,然后分析了智能客服系统的工作原理和技术要求,接着详细阐述了基于深度学习的自然语言处理技术在智能客服系统中的具体应用,包括语义理解、情感分析和问答系统等。最后对基于深度学习的自然语言处理技术在智能客服系统中的优势和挑战进行了总结。
685 1
|
缓存 API 异构计算
数据缓存系列分享(二):23秒完成从零开始搭建StableDiffusion
通过文章 数据缓存系列分享(一):打开大模型应用的另一种方式 我们了解ECI数据缓在使用体验、性能等方面相比于NAS、OSS存储方式的优劣。本文将继续结合实际场景 StableDiffusion 应用讲解数据缓存在大模型方面所带来的极致体验。值得一提的是,即便是对于没有任何准备、零算法基础、零大模型背景知识的开发者也可以轻松地通过ECI API在短短的23秒的时间内就可以搭建一个完整的StableDiffusion应用。
1269 0
数据缓存系列分享(二):23秒完成从零开始搭建StableDiffusion
|
存储 NoSQL 关系型数据库
深度图解 Redis Hash(散列表)实现原理
深度图解 Redis Hash(散列表)实现原理
339 0