排序算法详解

简介: 排序算法详解

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.基数排序


目录
相关文章
|
1月前
|
搜索推荐 C#
C#实现选择排序算法
C#实现选择排序算法
16 2
|
3月前
|
搜索推荐 算法
常见排序算法实现(二)
常见排序算法实现(二)
33 0
|
5月前
|
搜索推荐 C++
89 C++ - 常用排序算法
89 C++ - 常用排序算法
19 0
|
5月前
|
搜索推荐 算法
14 排序算法
14 排序算法
15 0
|
10月前
|
算法 搜索推荐
排序算法的简单认识
在进行很多便捷算法之前总是要实现对象的有序化,而这就将使用到排序相关的算法,即使目前诸多高级语言已然完成对于排序算法的封装,用户只需导入对应库文件即可调用排序算法完成排序,无需手写排序算法,但具体的排序算法的选择就必须对于排序算法有所认识。本文就将介绍两个简单的排序算法:选择排序与冒泡排序。 选择排序 为什么称为选择排序? 该算法每次都是对于未排序的关键字进行比较,选择出最小或最大的关键字,再对其交换位置,实现一次排序,需进行多次比较。 选择排序法是一种不稳定的排序算法。它的工作原理是每一次从待排序的数据元
44 0
|
搜索推荐 Java
常见的10种排序算法
常见的10种排序算法
76 0
|
搜索推荐
快排序算法(中)
快排序算法(中)
104 0
快排序算法(中)
|
搜索推荐
排序算法
排序之PHP实现
739 0
|
搜索推荐 算法
世界上最漂亮的排序算法!
直奔主题,世界上“最漂亮”的排序算法。 void stooge_sort(int arr[], int i, int j){          if (arr[i]>arr[j]) swap(arr[i], arr[j]);          if (i+1>=j) return;        .
1278 0
|
机器学习/深度学习 算法 搜索推荐