C# 鸡尾酒排序(双冒泡排序、搅拌排序或涟漪排序)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace Sort
{
    class CockTailSorter
    {
        private static int[] myArray;
        private static int arraySize;
        public static int[] Sort(int[] myArray)
        {
            arraySize = myArray.Length;
            CockTailSort(myArray);
            return myArray;
        }
        public static void CockTailSort(int[] myArray)
        {
            int low, up, index, i;
            low = 0;//数组起始索引
            up = myArray.Length - 1;//数组索引最大值
            index = low;//临时变量
	   //判断数组中是否有多个元素
            while (up > low)//每一次进入while循环都会找出相应范围内最大最小的元素并分别放到相应的位置
            {
		//进入该for循环会将索引限定范围内最大的元素放到最右边
                for (i = low; i < up; i++)//从上向下扫描
                {
                    if (myArray[i] > myArray[i + 1])
                    {
                        Swap(ref myArray[i], ref myArray[i + 1]);
                        index = i;//记录当前索引
                    }
                }
                up = index;//记录最后一个交换的位置
		//进入该for循环会将索引限定范围内最小的元素放到最左边
                for (i = up; i > low; i--)//从最后一个交换位置从下往上扫描
                {
                    if (myArray[i] < myArray[i - 1])
                    {
                        Swap(ref myArray[i], ref myArray[i - 1]);
                        index = i;
                    }
                }
                low = index;//记录最后一个交换的位置
            }
        }
        private static void Swap(ref int left, ref int right)
        {
            int temp;
            temp = left;
            left = right;
            right = temp;
        }
    }
}

鸡尾酒排序等于是冒泡排序的轻微变形。不同的地方在于从低到高然后从高到低,而冒泡排序则仅从低到高去比较序列里的每个元素。他可以得到比冒泡排序稍微好一点的效能,原因是冒泡排序只从一个方向进行比对(由低到高),每次循环只移动一个项目。

使用鸡尾酒排序,数组中的数字本是无规律的排放,先找到最小的数字,把他放到第一位,然后找到最大的数字放到最后一位。然后再找到第二小的数字放到第二位,再找到第二大的数字放到倒数第二位。以此类推,直到完成排序。

作者:jiankunking 出处:http://blog.csdn.net/jiankunking

时间: 2024-07-30 08:38:36

C# 鸡尾酒排序(双冒泡排序、搅拌排序或涟漪排序)的相关文章

内部排序:冒泡排序和选择排序

前言 之所以把冒泡排序和选择排序放在一起,是因为二者的实现代码很相似,而且都是最基本的排序方式,非常容易理解和实现.当然,如果仅仅是为了讲述这两种排序方式,那也根本没必要写这篇博文了.和上篇博文一样,我会在冒泡排序和选择排序原始代码的基础上给出一些改进和优化,这才是本文的重点所在. 原始冒泡排序 冒泡排序的思想很简单,如果要求排序后序列中元素按照从小到大的顺序排列,则冒泡排序的步骤如下: 1.依次比较序列中相邻的两个元素,将较大的放在后面,这样一趟比较后,最大的元素就放在了最后的一个位置: 2.

php中实现冒泡排序、快速排序、选择排序和插入排序等经典算法

// 冒泡排序 function BubbleSort($arr) { // 获得数组总长度 $num = count($arr); // 正向遍历数组 for ($i = 1; $i < $num; $i++) { // 反向遍历 for ($j = $num - 1; $j >= $i ; $j--) { // 相邻两个数比较 if ($arr[$j] < $arr[$j-1]) { // 暂存较小的数 $iTemp = $arr[$j-1]; // 把较大的放前面 $arr[$j-

c++-用冒泡排序法对10个数排序,怎么错了啊?

问题描述 用冒泡排序法对10个数排序,怎么错了啊? #includeusing namespace std;int main(){ int a[10]ij t; cout << ""input 10 numbers:"" << endl; for (i = 0; i < 10; i++) cin >> a[i]; cout << endl; for (j = 0; j < 9;j++) for (i = 0

Java选择排序和冒泡排序示例

package cc.test; /** * Demo描述: * 选择排序和冒泡排序 */ public class TestSort { public static void main(String[] args) { TestSort testSort=new TestSort(); int intArray []=new int []{11,3,-2,4,8,7}; testSort.selectSort(intArray); testSort.bubbleSort(intArray);

选择排序与冒泡排序

/// <summary> /// 选择排序 /// </summary> /// <param name="arr"></param> static void Sort1(int[] arr) { int len = arr.Length; for (var i = 0; i < arr.Length; i++) { int min = i; for (var n = i + 1; n < arr.Length; n++)

【算法】6 比较排序之外学习新的线性时间排序

回顾比较排序 相信阅读过前面5篇博文的童鞋们已经发现了"在排序的最终结果中,各元素的次序依赖于它们之间的比较".于是乎,这类排序算法被统称为"比较排序". 比较排序是通过一个单一且抽象的比较运算(比如"小于等于")读取列表元素,而这个比较运算则决定了每两个元素中哪一个应该先出现在最终的排序列表中. 声明:下面通过在维基百科中找到的非常完美的图示来介绍一系列比较排序. 插入排序 在该系列的[算法]1中我们便介绍了这个基本的算法,它的比较过程如下:

排序高级之交换排序_臭皮匠排序

Stooge 排序是一种低效的递归排序算法,甚至慢于冒泡排序.在<算法导论>第二版第7章(快速排序)的思考题中被提到,是由Howard.Fine等教授提出的所谓"漂亮的"排序算法. 该算法得名于三个臭皮匠,每个臭皮匠都打其他两个 实现 如果最后一个值小于第一个值,则交换这两个数 如果当前集合元素数量大于等于3: 使用臭皮匠排序前2/3的元素 使用臭皮匠排序后2/3的元素 再次使用臭皮匠排序前2/3的元素 最差时间复杂度 O(nlog 3 /log 1.5) 最差空间复杂度

vetor-用VETOR进行词频统计及排序,统计做出来了,排序怎么搞,代码如下。

问题描述 用VETOR进行词频统计及排序,统计做出来了,排序怎么搞,代码如下. #include #include #include using namespace std;typedef struct WORD_FREQ{ string strword; int freq;}WF;class CWordProcess {public: void OutPut(); void PushVector(string word); void Split(char pstr,char *pword);

如注释所写问题。。-不明白为什么设计的一个排序无法将string类数据进行排序

问题描述 不明白为什么设计的一个排序无法将string类数据进行排序 #include #include 题目是输入几个字符串(包含大写字母.数字.-,),按照题目给定的对应规律把字符串中的特定字符变为对应数字,形成号码(转换后的号码长度为7),然后按顺序输出号码以及对应的出现次数... using namespace std; class tel { public: int num; string ori;string *alt; tel(int n); tel sort(); void pr

sql server-SQL SERVER先按照成绩排序,成绩相同的按照成绩排序

问题描述 SQL SERVER先按照成绩排序,成绩相同的按照成绩排序 像这种两重排序,是不是只要写两个order by就行了?哪个写在前面呢? 解决方案 order by 字段1, 字段2 解决方案二: 一个order by就可以,把需要排序的两个字段用","隔开 解决方案三: select语句中,只用一个order by语句即可.但两个排序的字段可并列,优先的字段在前.比如: select * from table1order by 成绩,姓名 这样,列举的数据以"成绩&q