简单排序,冒泡排序,鸡尾酒排序,快速排序

简单排序:每次找出最大(小)的数,从头开始依次排序。

 1 public static int[] simplySort(int a[]) {
 2         for (int i = 0; i < a.length - 1; i++) {
 3 //            int min = a[i];
 4             int minIndex = i;
 5             for (int j =i + 1; j < a.length; j++) {
 6 //我的代码
 7 //                if (a[j] < min) {
 8 //                    min = a[j];
 9 //                    minIndex = j;
10 //                }
11 //老师代码
12                 if (a[j] < a[minIndex]) {
13                     minIndex = j;
14                 }
15             }
16 //            int m = a[i];
17 //            a[i] = a[minIndex];
18 //            a[minIndex] = m;
19             if (i != minIndex) {   //"^"求异或
20                 a[i] = a[i] ^ a[minIndex];
21                 a[minIndex] = a[i] ^ a[minIndex];
22                 a[i] = a[i] ^ a[minIndex];
23             }
24
25         }
26         return a;
27     }

冒牌排序:

    • 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
    • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
    • 针对所有的元素重复以上的步骤,除了最后一个。
    • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
 1 public int[] getSort(int[] array) {
 2         boolean swapped = true;    //循环控制
 3         for (int i = 0; swapped && i < array.length - 1; i++) {
 4             swapped = false;
 5             for (int j = 0; j < array.length - i-1; j++) {
 6                 if (array[j] > array[j+1]) {
 7                     int temp = array[j];
 8                     array[j] = array[j+1];
 9                     array[j+1] = temp;
10                     swapped = true;//当没有做交换的时候,也就是说数列已经是有序的了,就不做循环了
11                 }
12             }
13         }
14         return array;
15     }

鸡尾酒排序:

与冒泡排序不同的地方:
鸡尾酒排序等于是冒泡排序的轻微变形。不同的地方在于从低到高然后从高到低,而冒泡排序则仅从低到高去比较序列里的每个元素。他可以得到比冒泡排序稍微好一点的效能,原因是冒泡排序只从一个方向进行比对(由低到高),每次循环只移动一个项目。
以序列(2,3,4,5,1)为例,鸡尾酒排序只需要访问一次序列就可以完成排序,但如果使用冒泡排序则需要四次。
复杂度:
鸡尾酒排序最糟或是平均所花费的次数都是O(n^2),但如果序列在一开始已经大部分排序过的话,会接近O(n)。

 1 public static int[] cocktailSort(int[] a) {
 2         for (int i = 0; i < a.length / 2; i++) {
 3             for (int j = 0; j < a.length - i - 1; j++) {
 4                 if (a[j] > a[j + 1]) {
 5                     int tem = a[j];
 6                     a[j] = a[j + 1];
 7                     a[j + 1] = tem;
 8                 }
 9             }
10             for (int j = a.length - i - 1; j > 0; j--) {
11                 if (a[j] < a[j - 1]) {
12                     int tem = a[j];
13                     a[j] = a[j - 1];
14                     a[j - 1] = tem;
15                 }
16             }
17         }
18         return a;
19     }

快速排序:是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

具体步骤:

1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;

2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];

3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;

4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;

5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

 1 public static int[] quickSort(int[] a, int start,int end) {
 2         int low = start;
 3         int high = end;
 4         int pivot = a[low];
 5         while (low < high) {
 6             while (low < high && a[high] >= pivot) {
 7                 high--;
 8             }
 9             if (low < high && a[high] < pivot) {
10                 int tem = a[low];
11                 a[low] = a[high];
12                 a[high] = tem;
13                 low++;
14             }
15             while (low < high && a[low] < pivot) {
16                 low++;
17             }
18             if (low < high && a[low] >= pivot) {
19                 int tem = a[low];
20                 a[low] = a[high];
21                 a[high] = tem;
22                 high--;
23             }
24         }
25         if (low - 1 > start) {
26             quickSort(a, start, low - 1);
27         }
28         if (high + 1 < end) {
29             quickSort(a, low + 1, end);
30         }
31
32         return a;
33     }
时间: 2024-10-25 17:52:52

简单排序,冒泡排序,鸡尾酒排序,快速排序的相关文章

经典排序算法 - 鸡尾酒排序Cocktail sort

经典排序算法 - 鸡尾酒排序Cocktail sort 鸡尾酒排序基于冒泡排序,双向循环 还是看例子吧,给定待排数组[2 3 4 5 1] 第一趟过去时的每一步 第一步迭代,2 < 3不换 [2 3 4 5 1] 第二步迭代,3 < 4不换 [2 3 4 5 1] 第三步迭代,4 < 5不换 [2 3 4 5 1] 第四步迭代,5 > 1交换 [2 3 4 1 5] 第一趟回来时的第一步,鸡尾酒一次到头后就回返回来,再到头后再过去,来回比,一个来回能排两个数字 第五步迭代,1 &l

视频动画 | 什么是鸡尾酒排序?

鸡尾酒排序其实就是冒泡排序的变形,它的时间复杂度和冒泡排序一样,都是O(n^2),比快速排序要慢不少. 鸡尾酒排序算法 鸡尾酒排序的思想有点像摆钟一样,从左到右,又从右到左.而冒泡排序只是单向执行. 鸡尾酒排序也是交换排序,假设做一个升序排序,先从左到右,交换一趟把最大的数放置右边,然后从右到左,把最小的数放置左边. 视频动画 Code Result 初始状态 [5, 1, 9, 3, 7, 4, 8, 6, 2] 从左到右发生交换 [1, 5, 9, 3, 7, 4, 8, 6, 2] 从左到

Hark的数据结构与算法练习之鸡尾酒排序

算法说明 鸡尾酒排序又叫定向冒泡排序,鸡尾酒搅拌排序,搅拌排序,涟漪排序,回来排序,快乐小时排序. 鸡尾酒排序是交换排序的一种,它是冒泡排序的一个轻微的变种.冒泡是从低向高比较排序,鸡尾酒从低向高,从高向低交换着进行排序.大家看一下代码就知道了. 某些特殊有序数组情况下,鸡尾酒排序是效率略好于冒泡排序,例如: int[] arrayData = { 2, 3, 4, 5, 6, 7, 8, 9, 1 }; 鸡尾酒排序只排序一次就能出结果,而冒泡排序就需要8次才能出结果. 代码 使用的是java

各种常见的排序,冒泡排序,选择排序,插入排序,希尔排序,堆排序,快速排序,基数排序,桶排序

各种常见的排序 要开始找工作了,把以前学的各种小知识复习一遍,以下是各种常见的排序的简单实现(冒泡排序,选择排序,插入排序,希尔排序,堆排序,快速排序,基数排序,桶排序),至于原理就不写出来了,代码比较简单,看一下就懂,再不行可以随意找本书或百度! #include <iostream> using namespace std; // 冒泡 void BubbleSort(int data[], int length) { if(data == NULL || length <= 0)

冒泡排序,快速排序,归并排序,插入排序,希尔排序,堆排序,计数排序,桶排序,基数排序

选择排序,冒泡排序,快速排序,归并排序,插入排序,希尔排序,计数排序,桶排序,基数排序 以上是一些常用的排序算法. 选择排序 for(int i = 0; i < n; i++) { int minval = a[i]; int minid = i; for (int j = i+1; j < n; j++) { if (a[j] < minval) { minid = j; minval = a[j]; } } swap(a[i], a[minid]); } 最简单的就是选择排序,就是

冒泡排序和鸡尾酒排序(code)

昨天回顾了下冒泡排序和鸡尾酒排序,用面向对象的方式写了一下,并且优化了代码,记录一下~ 一.冒泡排序 # 冒泡排序 class BubbleSort(object): def __init__(self, data_list): self.data_list = data_list self.length = len(data_list) # 简单粗暴的排序方式 def b_sort(self): data_list = list(self.data_list) for i in range(s

基本排序算法(冒泡排序 选择排序 插入排序 快速排序 归并排序 基数排序 希尔排序)

冒泡排序 public static void bubbleSort(int[] arr){ int lgn = arr.length; for (int i = 0; i < lgn - 1; i++) { for (int j = 0; j < lgn - 1 - i; j++) { if(arr[j] > arr[j + 1]){ int temp = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = temp; } } } } 选择排序 publ

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

以下是最近学习各种算法的代码实现: #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(*

插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序——C++实现

首先是算法实现文件Sort.h,代码如下: /* * 实现了八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 * 以及快速排序.归并排序.堆排序和LST基数排序 * @author gkh178 */ #include <iostream> template<class T> void swap_value(T &a, T &b) { T temp = a; a = b; b = temp; } //插入排序:时间复杂度o(n^2) template<