C#排序1(冒泡排序、直接排序、快速排序)

冒泡排序:就是两个两个的这个比较好理解,代码也比较好写出来。

      它的原理就是相邻的两个两个的比较,如果前面的数比后面的大,那么交换,它这个在比较完一次的时候可以得到最大的一个数,然后接着循环,每次外循环中内循环的次数比原来少一次。

      

#region 冒泡排序
 2         /// <summary>
 3         /// 冒泡排序
 4         /// </summary>
 5         /// <param name="list"></param>
 6         /// <returns></returns>
 7         public List<int> BubbleSort(List<int> list)
 8         {
 9             for (int i = 0; i < list.Count - 1; i++)
10             {
11                 for (int j = 0; j < list.Count - 1 - i; j++)
12                 {
13                     if (list[j] > list[j + 1])
14                     {
15                         int temp = list[j];
16                         list[j] = list[j + 1];
17                         list[j + 1] = temp;
18                     }
19                 }
20             }
21             return list;
22         }
23         #endregion

直接排序原理是,让第一个元素和之后的每一个元素相互比较,如果大就交换,每次可以让第一个元素为最小值,如图:

#region 直接排序
        /// <summary>
        /// 直接排序
        /// </summary>
        /// <param name="list"></param>
        public void SelectionSort(List<int> list)
        {
            for (int i = 0; i < list.Count; i++)
            {
                for (int j = i + 1; j < list.Count; j++)
                {
                    if (list[i] > list[j])
                    {
                        int temp = list[i];
                        list[i] = list[j];
                        list[j] = temp;
                    }
                }
            }
        }
        #endregion

快速排序:貌似效率是最高的,在C#中的类库排序就是用的它:

它的原理是:有两个指针left和right  left默认先指向  最左边的元素 right默认指向最右边的元素,然后把指针为left的元素定义为标准,实现在标准左边的元素比标准小,右边的元素比标准大,然后经过递归不断的建立标准 ,而实现排序

下面是我的一些理解:

比如要排序的数组是  643581这些数,黄色代表Left指针;红色代表right指针;蓝色表示left和right重合

开始:left指向第一个元素,right指向最后一个元素

第1次:left指针和left+1比较,6>4,left指针向右移动,right不变;left的值和left+1的值互换

第2次:left指针和left+1比较,6>3,left指针向右移动,right不变;left的值和left+1的值互换

第3次:left指针和left+1比较,6>5,left指针向右移动,right不变;left的值和left+1的值互换

第4次:left指针和left+1比较,6<8,left指针不动,right向左移动;right的值和left+1的值互换

第5次:left指针和left+1比较,6>1,left指针向右移动,right不变;left的值和left+1的值互换;

发现left和right重合 ,实现6左边的比6小,6右边的比6大。然后重新定义

left=原来的left;right=left-1

left=left+1 与right=原来的right 接着进行下次遍历

下面是C#代码:

#region 快速排序
        /// <summary>
        /// 快速排序
        /// </summary>
        /// <param name="list"></param>
        /// <param name="left"></param>
        /// <param name="right"></param>
        public void QuickSort(List<int> list, int left, int right)
        {
            if (left < right)
            {
                int i = Division(list, left, right);
                QuickSort(list, i + 1, right);
                QuickSort(list, left, i - 1);
            }
        }

        /// <summary>
        ///把列表按照list[left]分到左右两边
        /// </summary>
        /// <param name="list"></param>
        /// <param name="left"></param>
        /// <param name="right"></param>
        /// <returns></returns>
        private int Division(List<int> list, int left, int right)
        {
            while (left < right)
            {
                int num = list[left];
                if (num > list[left + 1])
                {
                    list[left] = list[left + 1];
                    list[left + 1] = num;
                    left++;
                }
                else
                {
                    int temp = list[right];
                    list[right] = list[left + 1];
                    list[left + 1] = temp;
                    right--;
                }
                Console.WriteLine(string.Join(",", list));
            }
            Console.WriteLine("--------------\n");
            return left;
        }
        #endregion

时间: 2024-08-24 22:25:06

C#排序1(冒泡排序、直接排序、快速排序)的相关文章

经典排序:冒泡排序+选择排序 小结

经典排序:冒泡排序+选择排序 例 FJUTOJ 1842 冒泡排序 原理是取相邻两个数进行大小比较,判断是否交换. 以从小到大排序为例,冒泡排序就像气泡一样,最小的数慢慢浮上来,最大的数慢慢沉下去.那么完整从头到尾做一次之后最后一位就是原序列中最大的数字了.然后只需要对1~(n-1)个数字进行排序,完成后倒数第二个数字也为原序列的1~n-1元素中最大的值.如此重复,进行n-1次一定能完成排序.参考代码: 1 #include <stdio.h> 2 void BubbleSort(int *,

C语言-排序方法(冒泡排序,选择排序,快速排序, 插入排序 )

/* 排序算法 */ #include <stdio.h> //冒泡排序 void Bubble_sort(int *p_val, int size) { int j = 0; int i = 0; for (i = 0;i < size - 1;i++) { for (j = i;j < size - 1;j++) { if (*(p_val + j) > *(p_val + j + 1)) { *(p_val + j) ^= *(p_val + j + 1); *(p_v

简单排序算法 冒泡排序 选择排序 插入排序

冒泡排序: 总体思路:对未排序的各个元素,依次比较两个元素,如果这两个元素为逆序(与想要的顺序相反),则交换这两个元素. 这样可以有两种排序的思路: 思路一: 固定位置排序:比如有一个未排序队列,下标依次为0,1,2,.....N-1, 第一轮排序:首先固定位置0,将下标为0的元素依次和下标为1.下标为2.....下标为N-1的元素相比较,若相比较的两个元素为逆序,则交换这两个元素,这样第一轮排序完之后,位置为0的元素,就是最大的(最小的). 第二轮排序:首先固定位置1,将下标为1的元素依次和下

插入排序 | 冒泡排序 | 希尔排序 | 堆排序 | 快速排序 | 选择排序 | 归并排序

以下是最近学习各种算法的代码实现: #include <stdlib.h> #include <stdio.h> #include <time.h> #include <limits.h> typedef int EleType; typedef int (*CompFunc)(void *,void *); int IntComp(void * a,void *b) { if(*(int *)a > *(int *)b) return 1; if(*

图形化排序算法比较:快速排序、插入排序、选择排序、冒泡排序

图形化排序算法比较:快速排序.插入排序.选择排序.冒泡排序

排序算法详解(Go语言实现):冒泡排序/选择排序/快速排序/插入排序

算法是程序的灵魂,而排序算法则是一种最基本的算法.排序算法有许多种,本文介绍4中排序算法:冒泡排序,选择排序,快速排序和插入排序,以从小到大为例. 一.冒泡排序 冒泡排序的原理是,对给定的数组进行多次遍历,每次均比较相邻的两个数,如果前一个比后一个大,则交换这两个数.经过第一次遍历之后,最大的数就在最右侧了:第二次遍历之后,第二大的数就在右数第二个位置了:以此类推. //冒泡排序(排序10000个随机整数,用时约145ms) func bubbleSort(nums []int) { for i

学习算法 -- 马桶排序、冒泡排序和快速排序

目录 马桶排序(令人作呕的排序) 冒泡排序(面试都要问的算法) 快速排序(见证亚当和夏娃的爱情之旅) 马桶排序(令人作呕的排序) 一.场景:期末考试完了,老师要将同学们的分数从高到低排序.假设班上有 5 名同学,分别考了 5 分.3 分.5 分.2 分和 8 分[满分:10 分],排序后的结果就是 8 5 5 3 2,现在,让我们先思考 10 分钟吧! 二.思路: (1)先创建一个数组 int scores[11],就有 scores[0]~scores[10] 共 11 个变量.我们用变量值为

[C#] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序

用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html  马桶排序 一.场景:期末考试完了,老师要将同学们的分数从高到低排序.假设班上有 5 名同学,分别考了 5 分.3 分.5 分.2 分和 8 分[满分:10 分],排序后的结果就是 8 5 5 3 2,现在,让我们先思考 10 分钟吧! 二.思路: (1)先创建一个数组 int scores[11],就有 scores[

C# 插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序

下面列出了数据结构与算法的八种基本排序:插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序,然后是测试的例子.代码位置:http://download.csdn.net/detail/luozuolincool/8040027 排序类: public class Sortings { //插入排序 public void insertSort(int[] array) { int temp = 0; int index = 0; for (int i = 0; i <

七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)

 写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列.因此排序掌握各种排序算法非常重要.对下面介绍的各个排序,我们假定所有排序的关键字都是整数.对传入函数的参数默认是已经检查好了的.只是简单的描述各个算法并给出了具体实现代码,并未做其他深究探讨. 基础知识: 由于待排序的记录数量不同,使得排序过程中设计的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是待排序记录存放在计算机随机存储器中进行的排序过程.另一类是外部排序,