当前位置 : 主页 > 网络编程 > 其它编程 >

排序——冒泡排序和希尔排序

来源:互联网 收集:自由互联 发布时间:2023-07-02
1,冒泡排序的基本思想:1,每次从后向前进行(假设为第i次),jn-1,n-2,,i,两两比较v[j-1]和v[j]的关键字;如果发生逆序,则交 1,冒泡排序的基本思想: 1,每次从后向前进行(假设为
1,冒泡排序的基本思想:1,每次从后向前进行(假设为第i次),jn-1,n-2,,i,两两比较v[j-1]和v[j]的关键字;如果发生逆序,则交

1,冒泡排序的基本思想:

1,每次从后向前进行(假设为第 i 次),j = n - 1, n - 2, ..., i,两两比较 v[j-1] 和 v[j] 的关键字;如果发生逆序,则交换 v[j-1] 和 v[j];

1,水低泡泡,因为轻,从水底冒出来;

2,第 i 次冒泡排序示例及元素排序示例:

1,冒泡排序每次将最后无序序列中最小的元素找出并排到有序队列后面;

2,Exchang 用来记录是否发生交换,一旦发生逆序就交换,交换则 Exchang == 1,当待排对象已经排好序,如果比较一致,发现Exchang 没有改变,则说明对象已经排好序了,没必要进行排好序了;

3,关键是从后向前进行,两两进行比较,发生逆序就交换;

3,冒泡排序 Sort::Bubble 的实现(仅 *.cpp 文件):

1 /* 冒泡排序 */ 2 template 3 static void Bubble(T array[], int len, bool min2max = true) // O(n*n) 最坏情况下,冒泡排序的较其他排序要多一点点 4 { 5 bool exchange = true; // 标记位,是否发生了交换,不交换时候就排好序了;不一定是最坏排序,取决于这个 exchange 6 for(int i=0; (ii;最//坏情况下这个循环要做完 */11 for(int j=len-1; j>i; j--)12 {13 if( min2max ? (array[j]1]) : (array[j]>array[j-1]) ) // 发生逆序14 {15 Swap(array[j], array[j-1]); // 交换16 exchange = true; // 交换了17 }18 }19 }20 }

4,希尔排序的基本思想:

1,将待排序列划分为若干组,在每一组内进行插入排序,以使整个序列基本有序,然后再对整个序列进行插入排序;

5,希尔排序示例及元素排序示例:

6,希尔排序 Sort::Shell 实现(仅 *.cpp 文件):

1 /* 希尔排序 */ 2 template 3 static void Shell(T array[], int len, bool min2max = true) // 不稳定的排序法,O(n的1.5) 4 { 5 int d = len; // 设置间隔为 len 6 7 do // 都做几次插入排序就可以得到更快的算法了 8 { 9 /* 数学角度证明这样比较好比较困难,但是实践证明这样比较好,这个公式保证了 d 大于 1,同时当 d 很大的时候,减小比较快,当 d 接近 1 的时候减小比较慢;而 d-- 不能提高效率*/10 d = d / 3 + 1;11 12 for(int i=d; i=0)29    }

7,小结:

1,冒泡排序每次从后向前将较小的元素交互到位;

2,冒泡排序是一种稳定的排序法,其复杂度为 O(n*n);

3,希尔排序通过分组的方式进行多次插入排序;

4,希尔排序是一种不稳定的排序法,其复杂度为 O(n*√n);

1,分组的排序方法,所以是个不稳定的排序法;

【本文由:高防服务器ip http://www.558idc.com/gfip.html 复制请保留原URL】
上一篇:使用SpringAOP记录Controller层操作日志
下一篇:没有了
网友评论