C初级_排序

写在前面,本文进行语言叙述时,默认排序目的为从左至右,排成从大到小

1.判断算法好坏的标准-时间复杂度和空间复杂度

一般认为,算法无法同时即保证低的时间复杂库,还保证低的空间复杂度

详细的说明请见时间复杂度与空间复杂度

2.冒泡排序法

冒泡排序法就是从左至右依次选定一个数A,同后位数B做比较,如果A>B,则A继续与后位数C作比较;如果A<B,则B与后位数C作比较,依次类推,直至进行到数字结尾。

动画演示请见冒泡排序演示

3.选择排序法

选择排序法就是依次选择第一个数A,同后面所有数进行比较,当出现比A小的数B时,B同后面的数比较,直到找到本次比较的最小数C,将C的位置与A的位置交换,依次类推,直到所有数选择后完成比较

动画演示请见选择排序法演示

4.插入排序法

插入排序法就是通过选择第一个数A后,紧邻的后位数B同A进行比较,当B>A,则B与A交换位置;当B<A,则B与A位置不变。完成AB之间的顺序后,将后位数C同前两位AB进行比较,确定C的位置,依次类推,直至比较结束。

动画演示请见插入排序法演示

5.快速排序法

快速排序法就是通过选定初始值A,选定左值L,负责找到比A小的数;选定右值R,负责找到比A大的数,当L与R相等时,将A=L与R指向的位置,此时A的左右两边分成比A小的部分a1和比A大的部分a2,对a1和a2分别执行上述过程,直至无法进行划分为止。

文字说明请见快速排序法文字说明
动画演示请见快速排序法演示

6.代码实例

//头文件
#pragma once
#include<stdio.h>
void printArr();
void bulleSort(int arr[], int len);
void selectSort(int arr[], int len);
void insertSort(int arr[], int len);
void quickSort(int arr[], int left, int right);
//主函数
#include<stdio.h>
#include"test.h"
int main()
{
 int arr[12] = { 3,4,5,65,6,34,23,32,3,43 };
 printArr();
 bulleSort(arr, 12);
 selectSort(arr, 12);
 insertSort(arr, 12);
 getchar();
 return 0;
}
//自定义头文件
#include<stdio.h>
//预处理复习
void printArr()
{
 printf("雷浩啊");
}
//冒泡排序
void bulleSort(int arr[], int len)
{
 printf("\n\n以下数字用于说明冒泡排序算法\n");
 int temp;
 for (int i = 0; i < len-1; ++i)
 {
  for (int j = 0; j < len-1-i ; ++j)
  {
   if (arr[j] > arr[j + 1])
   {
    temp = arr[j];    
    arr[j] = arr[j+1];
    arr[j + 1] = temp;
   } 
  }
 }
 for (int i = 0; i < len; ++i)
 {
  printf("%-4d", arr[i]);
 }
}
//选择排序
void selectSort(int arr[], int len)
{
 printf("\n\n以下数字用于说明选择排序法\n");
 int k,temp;
 for (int i = 0; i < len - 1; ++i)
 {
  k = i;
  for (int j = i + 1; j < len; ++j)
  {
   if (arr[j] < arr[k])
   {
    k = j;
   }
  }
  temp = arr[k];
  arr[k] = arr[i];
  arr[i] = temp;
 }
 for (int i = 0; i < len; ++i)
 {
  printf("%-4d", arr[i]);
 }
}
//插入排序
void insertSort(int arr[], int len)
{
 printf("\n\n以下数字用于说明插入排序\n");
 int temp;
 for (int i = 1; i < len; ++i)
 {
  temp = arr[i];
  int j = i - 1;
  while (j>=0&&arr[j]>temp)
  {
   arr[j + 1] = arr[j];
   --j;
  }
  arr[j + 1] = temp;
 }
 for (int i = 0; i < len; ++i)
 {
  printf("%-4d", arr[i]);
 }
}
//快速排序法
void quickSort(int arr[], int left, int right)
{
 printf("\n\n本处用于说明快速排序法");
 int temp;
 if (left >= right) return;
 int i = left,j = right;
 //1.数组一分为2
 while (i < j)
 {
  while (i < j&&arr[left] < arr[j])--j;
  while (i < j&&arr[left] >= arr[j])++i;
  if (i < j)
  {
   temp = arr[i];
   arr[i] = arr[j];
   arr[j] = temp;
  }
 }
 temp = arr[left];
 arr[left] = arr[i];
 arr[i] = temp;
 //2.对上述两部分单独排序
 quickSort(arr, left, i-1);
 quickSort(arr, i+1, right);
 for (int i = 0; i < left+right; ++i)
 {
  printf("%d", arr[i]);
 }
}

猜你喜欢

转载自blog.csdn.net/weixin_41743247/article/details/88885892