首页 > 其他分享 >冒泡排序、插入排序、快速排序

冒泡排序、插入排序、快速排序

时间:2024-06-06 16:14:39浏览次数:29  
标签:arr int 插入排序 冒泡排序 times high low 排序

三种排序:冒泡排序、插入排序、快速排序

规则:

冒泡排序:每一轮循环后,最大的一个数被交换到末尾,因此,下一轮循环就可以“刨除”最后的数,每一轮循环都比上一轮循环的结束位置靠前一位。

插入排序:将待排序数组分为已排序和未排序两部分,初始已排序部分只包含第一个元素。然后,从第二个元素开始,将其与已排序部分的元素依次比较,并找到合适的位置插入,使得已排序部分仍然保持有序。

快速排序:即在一个无序的序列中选取一个任意的基准元素pivot,利用pivot将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用递归的方法分别对前后两部分重复上述操作,直到将无序序列排列成有序序列。

直接上代码:

创建一个控制台程序,写入代码

using System;
using System.Text.Json.Nodes;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Utilities;

Sort_Bubble();//冒泡排序
Sort_Insert();//插入排序
Sort_Quick();//快速排序


//冒泡排序
void Sort_Bubble()
{
Console.WriteLine("冒泡排序");
List<int> arr = new List<int>() { 28, 12, 89, 73, 65, 18, 96, 50, 8, 36 };
// 排序前:
PrintStr(arr);

int times = 0;
for (int i = 0; i < arr.Count - 1; i++)
{
for (int j = 0; j < arr.Count - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
// 交换
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
PrintStr(arr);
times++;
}
}
// 排序后:
PrintStr(arr);
Console.WriteLine("排序次数:"+times);
}


//插入排序
void Sort_Insert()
{
Console.WriteLine("插入排序");
List<int> arr = new List<int>() { 28, 12, 89, 73, 65, 18, 96, 50, 8, 36 };
// 排序前:
PrintStr(arr);
int times = 0;
for (int i = 0; i < arr.Count - 1; i++)
{
for (int j = i; j > 0 && arr[j] < arr[j - 1]; j--)
{
// 交换
int tmp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = tmp;
PrintStr(arr);
times++;
}
}
// 排序后:
PrintStr(arr);
Console.WriteLine("排序次数:" + times);
}


//快速排序
void Sort_Quick()
{
Console.WriteLine("快速排序");
List<int> arr = new List<int>() { 28, 12, 89, 73, 65, 18, 96, 50, 8, 36 };
// 排序前:
PrintStr(arr);
int times = 0;
Sort(arr, 0, arr.Count - 1, ref times);
// 排序后:
PrintStr(arr);
Console.WriteLine("排序次数:" + times);
}
void Sort(List<int> arr, int low, int high, ref int times)
{
if (low >= high)
return;

Console.WriteLine("打印数组:");
PrintStr(arr);
var a = arr[low];
Console.WriteLine("寻找" + a + "的位置");
int index = SortUnit(arr, low, high, ref times);
Console.WriteLine(a + "的位置为[" + index + "]");
Console.WriteLine(arr[index] + "左边排序");
/*对左边单元进行排序*/
Sort(arr, low, index - 1, ref times);
Console.WriteLine(arr[index] + "右边排序");
/*对右边单元进行排序*/
Sort(arr, index + 1, high, ref times);
}
int SortUnit(List<int> arr, int low, int high, ref int times)
{
int key = arr[low];
while (low < high)
{
while (arr[high] >= key && low < high)
high--;
/*比key小的放左边*/
arr[low] = arr[high];
arr[high] = key;
PrintStr(arr);
times++;
/*从前向后搜索比key大的值,比key大的放右边*/
while (arr[low] <= key && low < high)
++low;
/*比key大的放右边*/
arr[high] = arr[low];
arr[low] = key;
PrintStr(arr);
times++;
}
return high;
}

//输出
void PrintStr(List<int> ns){
var str1 = "";
foreach (var n in ns)
{
str1 = str1 + n + ",";
}
Console.WriteLine(str1);
}

 

 

冒泡排序过程:

 插入排序

 快速排序

 

 

标签:arr,int,插入排序,冒泡排序,times,high,low,排序
From: https://www.cnblogs.com/luoxiaoxiao102/p/18235443

相关文章

  • 三种常见的排序方法
    一.比较交换排序法方法:将第一个元素的数据与其后的每个数据进行比较。如果不符合比较类型,则交换数据。例如:将一组数据15,8,4,13,6,10,17,1按照由小到大的顺序递增排列     分析:第一轮arr[0]分别与后面的数据比较,互换数值,将最小的数安排在下标是0的数组元素中。 ......
  • 八(汇编程序设计):输入5个同学成绩(有学号提示),然后排序,最后显示出名次表(学号,成绩)。要求:应
    代码DSEG SEGMENTGRADEDB5DUP(0)XUEHAODB'1','2','3','4','5'BUFDB4DUP(0)INFDB"Student",'$'NEWLINEDB0DH,0AHDSEGENDSSSEGSEGMENTSTACKSKTOPDB50DUP(0)S......
  • 快速排序——AcWing785.快速排序
    AcWing785.快速排序题目描述785.快速排序-AcWing题库运行代码#include<iostream>#include<algorithm>usingnamespacestd;constintN=1e6+6;intq[N];voidquick_sort(intq[],intl,intr){if(l>=r)return;intm=l+r>>1;//>......
  • Hive3.1.2分区与排序(内置函数)
    1、Hive分区(十分重要!!)分区的目的:避免全表扫描,加快查询速度!在大数据中,最常见的一种思想就是分治,我们可以把大的文件切割划分成一个个的小的文件,这样每次操作一个个小的文件就会很容易了,同样的道理,在hive当中也是支持这种思想的,就是我们可以把大的数据,按照每天或者每小时切分......
  • 常见的排序算法——快速排序(二)
    本文记述了对快速排序的2项改进的基本思想和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。◆思想本文实现了《算法(第4版)》书中提到的2项改进,切换到插入排序:对小规模子数组使用插入排序。减少在小规模数组中的递归调用能改进整个算法。三取样切分:将取样......
  • C语言排序
    一、排序的运用生活中排序随处可见,比如我们高考时的排名,大学学校水平的排名等,打开京东,可以发现每样商品按照不同的方式排序,比如综合,销量,价格。其内部需要排序代码来完成。二、常见的排序算法一、交换排序一、冒泡排序冒泡排序是一种最容易想到的排序,但是其效率不高,没有实......
  • 头歌--交换类排序
    本关任务:编写函数通过比较数组相邻两个元素求数组最大值。#include<stdio.h>#include<stdlib.h>voidinput(int*&a,int&n);voidoutput(int*a,intn);voidcomp(int*a,intn);voidswap(int&a,int&b);intmain(){  inti,n;  int*a=NULL; ......
  • 数据结构学习笔记-简单选择排序
    简单选择排序的算法设计与分析问题描述:设计并分析简单选择排序【算法设计思想】迭代选择:算法通过循环遍历数组,进行size次迭代。最小值选择:在每次迭代(i)中,算法致力于找到未排序子数组(arr[i]到arr[size-1])内最小元素的索引。这个最小元素将被选出来进行交换。交......
  • Qt中的多线程与线程池浅析+实例----冒泡排序和快速排序
    转自:https://www.cnblogs.com/wanghongyang/p/14902679.html今天学习了Qt中的多线程和线程池,特写这篇博客来记录一下2|02.多线程2|12.1线程类QThreadQt中提供了一个线程类,通过这个类就可以创建子线程了,Qt中一共提供了两种创建子线程的方式,先看一下这个类中提供的一些常用......
  • 已知一组数字:21,25,11,32,12,35,55,77,66,要求按以下规则进行排序.第一个数最大,第二个数最小,第三个数字是剩下中的最
    importjava.util.Arrays;importjava.util.ArrayList;importjava.util.Collections;publicclassTest_A19{publicstaticvoidmain(String[]args){Integer[]numbers={21,25,11,32,12,35,55,77,66};Arrays.sort(numbers,Collect......