引言:
老师已经是第三次跟我们讲排序了,可想而知排序它的重要性,这三种基本排序的方式值得我们思考和研究,理解其中的思想。
简述:
概念:
将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序
常见排序算法:
快速排序、希尔排序、堆排序、直接选择排序不是稳定的排序算法,而基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。
选择排序:
原理:
将初始序列(A[0]~A[n-1])作为待排序序列,按照从小到大进行排序,假设现在A[0]是最小的,将剩余的元素与其进行比较,如果比A[0]大,则互换位置,如果比A[0]小则不动,这样第一轮就轮完了,找到了最小的元素;第二轮,假设A[1]是次小的,将剩余的元素与其比较,找到次小的元素放到A[1]位置,依次进行下去,经过n-1轮排序,顺序就排好了。
示图:
代码实现:
class 选择排序 { //定义一个数组 static List<int> list = new List<int>() { 48, 15, 26, 82, 65 }; static void Main(string[] args) { //调用排序方法 Choice(); PrintList (); } //选择排序 static void Choice() { //定义变量temp 和minIndex都为0 int temp = 0; int minIndex = 0; //数组中最小数的下标 for (int i = 0; i < list .Count ; i++) { minIndex = i; //标记此下标为最小值 for (int j = i+1; j < list .Count ; j++) { //依次和数组中其他数据进行比较,如果其他数据比当前标记的数值小,则把较小数值的下标赋给minIndex if (list[j]<list[minIndex]) { minIndex = j; } } //交换数据 temp = list[minIndex]; list[minIndex] = list[i]; list[i] = temp; } } private static void PrintList() { foreach (var item in list) { Console.WriteLine(string.Format("{0}", item)); } Console.WriteLine(); Console.ReadLine(); } }
效果:
冒泡排序:
原理:
将初始序列(A[0]~A[n-1])作为待排序序列,按照从小到大进行排序,相邻的两个元素进行比较,则较大的数放到后面,这样一轮结束后最大的元素就放到了最后位置,依次进行,n-1轮之后,顺序就排好了。
示图:
代码实现:
class 冒泡排序 { //定义一个数组 static List<int> list = new List<int>() { 48, 15, 7, 34, 25 }; static void Main(string[] args) { //调用排序方法 Bubble(); PrintList(); } //冒泡排序 static void Bubble() { //定义临时变量 int temp = 0; for (int i = list.Count; i > 0; i--) { for (int j = 0; j < i-1; j++) { //相邻的两个数进行比较,把较大的数放到后面 if (list[j] >list[j+1]) { //交换数据 temp = list[j]; list[j] = list[j+1]; list[j+1] = temp; } } } } private static void PrintList() { foreach (var item in list) { Console.WriteLine(string.Format("{0}", item)); } Console.WriteLine(); Console.ReadLine(); } }
效果:
插入排序:
原理:
给定序列,存在一个分界线,分界线的左边被认为是有序的,分界线的右边还没被排序,每次取没被排序的最左边一个和已排序的做比较,并插入到正确位置。(从小到大)
示图:
代码实现:
class 插入排序 { //定义一个数组 static List<int> list = new List<int>() { 48, 15, 7, 34, 25 }; static void Main(string[] args) { //调用排序方法 Insert(); PrintList(); } //插入排序 static void Insert() { for (int i=1;i <list.Count;i++) { //定义临时变量 int temp = list[i]; int j = i; //如果在已经排好序的数列段中没有找到比新值小的数 while (j>0 && temp <list [j-1]) { //将比新数值大的数向后移 list[j] = list[j - 1]; j--; } //如果在已经排好序的数列中找到比新数小的数值,将数值替换到此位置 list[j] = temp; } } private static void PrintList() { foreach (var item in list) { Console.WriteLine(string.Format("{0}", item)); } Console.WriteLine(); Console.ReadLine(); } }
效果:
比较:
一张图胜过千言万语。
总结:
1.思想上移,行动下移。
2.实践了才知道是否正确
时间: 2024-10-09 07:42:22