快速排序,选择排序,冒泡排序

三种排序算法是在数组排序中用到比较多的,下面来具体说明各种排序方法以及区别

快速排序法

使用快速排序方法对a[n]排序
从a[n]中选择一个元素作为基准,一般选a[0],设定low指向a[0](队首),high指向a[n-1](队尾),
先从队尾开始向前扫描,若a[high]>a[0],则high++,否则将a[high]赋值给a[low],即a[low]=a[high]
然后从队首开始向前扫描,若a[low]<a[0],则low++,否则a[high]=a[low]
这样,会将所有小于基准数a[0]的元素放到a[0]左边,把大于a[0]的元素都放到a[0]右边
再使用递归分别对左边、右边的子数组进行排序,最终完成排序

 1 //快速排序算法
 2 static void quicksort(int arr[], int low, int high){
 3     int length = high;
 4     if(low < high){
 5         int temp = arr[low];//temp是作为比较的基数
 6         while(low < high){
 7             // 当队尾的元素大于等于基准数据时,向前挪动high指针
 8             while(low < high && arr[high] >= temp){
 9                 high--;
10             }
11             //此时是arr[high] < temp,将arr[high]赋值给arr[low]
12             arr[low] = arr[high];
13
14             // 当队首的元素大于等于基准数据时,向后挪动low指针
15             while(low < high && arr[low] <= temp){
16                 low++;
17             }
18             //此时是arr[low] > temp, 将arr[low]赋值给arr[high]
19             arr[high] = arr[low];
20         }
21         //当一轮循环过后,low = high时,此时的low或high就是temp的正确索引位置
22         //此时low位置的值并不是tmp,所以需要将temp赋值给arr[low]
23         arr[low] = temp;
24         int index = low;//返回temp的索引位置
25
26         // 递归调用,按照上述方法流程继续对index位置两端的子数组进行排序
27         quicksort(arr, 0, index-1);
28         quicksort(arr, index+1, length);
29     }
30 }
31
32 //冒泡排序,小到大
33 @Test
34 public void bubbleSort(){
35     Scanner sc = new Scanner(System.in);
36     int temp, arr[];
37     while(sc.hasNext()){//可循环进行测试
38         //输入数组长度和数组,比如:输入5回车后,再输入 1 3 4 2 6
39         int n = sc.nextInt();
40         arr = new int[n];
41         for(int i =0;i<n;i++){
42             arr[i] = sc.nextInt();
43         }
44         //数组中相临两数比较,前面的大于后者就交换位置
45         //冒泡排序:每一轮将依次出现一个最大数(最右边),次大数...
46         for(int i=0;i<n-1;i++){
47             for(int j=0;j<n-1-i;j++){
48                 if(arr[j] > arr[j+1]){
49                     temp = arr[j];
50                     arr[j] = arr[j+1];
51                     arr[j+1] = temp;
52                 }
53             }
54         }
55         //排序后
56         for(int i=0;i<n;i++){
57             System.out.print(arr[i]+" ");
58         }
59     }
60 }
61
62 //选择排序,小到大
63 @Test
64 public void selectSort(){
65     Scanner sc = new Scanner(System.in);
66     int temp, arr[];
67     while(sc.hasNext()){//可循环进行测试
68         int n = sc.nextInt();
69         arr = new int[n];
70         for(int i =0;i<n;i++){
71             arr[i] = sc.nextInt();
72         }
73         //数组中每个数依次与它后面的数进行比较,若前者大于后者,交换二者位置
74         for(int i=0;i<n-1;i++){
75             for(int j=i+1;j<n;j++){
76                 if(arr[i]>arr[j]){
77                     temp = arr[i];
78                     arr[i] = arr[j];
79                     arr[j] = temp;
80                 }
81             }
82         }
83         //排序后
84         for(int i=0;i<n;i++){
85             System.out.print(arr[i]+" ");
86         }
87     }
88 }

另外,冒泡排序和选择排序相似,时间复杂度也相同。

下面是各种排序算法的复杂度比较:

以上就是三种排序法的介绍,如有不足指出!

快速排序可参考:https://blog.csdn.net/nrsc272420199/article/details/82587933

int length = high;

原文地址:https://www.cnblogs.com/superwei001/p/12038736.html

时间: 2024-07-31 17:21:43

快速排序,选择排序,冒泡排序的相关文章

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

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

01. Java的经典排序--选择排序--冒泡排序--折半查找(二分查找)

Java的经典排序--选择排序--冒泡排序--折半查找 选择排序 选择排序 3 2 1 5 8 0 1 3 2 5 8 1 1 2 3 5 8 2 1 2 3 5 8 3 1 2 3 5 8 public static void main(String[] args) { int[] arr={3,2,1,5,8}; selectSort(arr); for(int i = 0 ; i < arr.length ; i ++){ System.out.println(arr[i]) ; } }

数组排序代码,冒泡排序&amp;快速排序&amp;选择排序

冒泡排序: for(var i=0;i<arr.length-1;i++){ for(var j=0;j<arr.length-1-i;j++){ if(arr[j]>arr[j+1]){ var temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } 选择排序: var arr=[2,5,4,6,3,7,1]; for(var i=0;i<arr.length-1;i++){ for(var j=i+1;j<arr.length

简单分析选择排序,冒泡排序

1,选择排序的原理  1.1 选择排序就是会依次利用每一位索引上的值,与它后面的所有值进行比较,而且在每经过一轮比较,最值就会出现在最前面 2,冒泡排序的原理  2.1 冒泡排序的原理就是两个相邻的元素进行比较,每比较一轮,最值就会出现在最后面 #include <stdio.h>void getLow(int count[],int length);void countNumber(int count1[],int length);void getLarge(int count[],int

选择排序&amp;冒泡排序&amp;折半查找

//选择排序 void test2(int a[],int len){ //每次找出一个最小值,最小值依次与原数组交换位置,通过下标来完成交换,最小值下标每次都在变,变量存储 //    假如第一个是最小值 int mine=0; int teamp=0; //    外层负责趟数 for (int i=0; i<len; i++) { //    假如每一次的第一个是最小值 mine=i; //    内层负责寻找每趟的最小值 //        每次起始比较值都不一样所以j=i+1,改变次数

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

排序: public class SortDemo { public static void main(String[] args) { int[] arr = { 5, 8, 9, 12, 55, 565, 421, 12, 2512, -5, -56 }; // int[] arr = { 6, 9, 4589, 442, 458, 5232, -788, 7, 545, -44, 55, -11 // }; // selectionSort(arr); // bubbleSort(arr)

选择排序 冒泡排序 插入排序

1.选择排序 每一次找出最小的值,放在最前面的位置,一个一个安置 //选择排序 #include<iostream> #include<climits> using namespace std; template<class T> void gcd(T a[],int n){ int mix,temp; for(int i=0;i<n-1;i++){ mix=i; for(int j=i+1;j<n;j++) if(a[j]<a[mix]) mix=j

&lt;每日一题&gt;题目26:选择排序(冒泡排序改进版)

''' 选择排序:选择最小的,以此类推 ''' import random import cProfile def select_Sort(nums): for i in range(len(nums)-1): for j in range(i+1,len(nums)): if nums[i] > nums[j]: # max = nums[i] # nums[i] = nums[j] # nums[j] = max #python有更好的写法 nums[i],nums[j] = nums[j]

#排序算法#【1】概述、冒泡排序、选择排序

排序算法分类: 内部排序(在排序过程中不需要访问外存就可以完成排序) 外部排序 内部排序分类: 交换排序 冒泡排序 快速排序 选择排序 直接选择排序 堆排序 插入排序 直接插入排序 希尔排序 合并排序 外部排序: 常见的是多路归并算法,即将原文件分为多个能够一次装入内存一部分,分别把每一部分调入内存完成排序,然后对已经排序的子文件进行归并排序 冒泡排序法: 冒泡排序法是一种相邻数据交换的排序方法. 冒泡排序法的基本思想是:对待排序记录关键字从后往前(逆序)进行多遍扫描,当发现相邻两个关键字的次序

排序(二)__冒泡排序、简单选择排序和直接插入排序

前面<排序(一)__综述>提到按照算法的复杂度分为简单算法和改进算法两大类,本文主要就简单算法中的冒泡排序.简单选择排序和直接插入排序进行通俗详细的解析. 一.冒泡排序 1.基本概念 冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止.(动态图来自维基百科) 2.关键代码(优化之后) void BubbleSort(SqList *L) { int i,j; Status flag=TRUE;            //flag用作标记,避