写在前面,本文进行语言叙述时,默认排序目的为从左至右,排成从大到小
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分别执行上述过程,直至无法进行划分为止。
扫描二维码关注公众号,回复:
5945651 查看本文章
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]);
}
}