排序算法之冒泡和快排

冒泡排序:

顾名思义:参与排序的数据就像水中的气泡慢慢浮出水面一样“浮”到数列顶端。

冒泡排序要点:

1、  两层循环,外层循环控制走访数列重复进行的次数,内层循环进行数据的比较、交换,是数据“上浮”。

2、  内层循环是相邻的数据进行比较。

C语言代码实现:

// 冒泡排序
void sort_bubble(int n){
    int i,j;
    for(i=0;i<n-1;i++){
        for(j=0;j<n-1-i;j++){
            if(arr[j]>arr[j+1]){
                // 进行一次交换
                exchange(j,j+1);
            }
        }
    }

}

代码优化:

通过对核心代码的分析,不难发现,当给我们的数据已经是有序状态时,外层循环仍旧会执行n-1次,内层循环因为数据已经有序,只会进行相邻数据的比较而不进行数据的交换。这个时候我们的外层循环导致我们的程序做了很多的无用功。因此我们需要对外层循环进行优化。

我们已经知道,如果我们的数据已经是有序状态时,程序的内层循环是只进行数据的比较而不进行数据的交换,那么我们可以在内层循环设置一个变量,用来通知外层循环数据是否已经达到有序状态,如果已经有序,则跳出外层循环,否则,继续执行。

优化代码:

// 冒泡排序
void sort_bubble(int n){
    int i,j;
    int m;
    for(i=0;i<n-1;i++){
        m = 1;  // 默认数据已经为有序状态
        for(j=0;j<n-1-i;j++){
            if(arr[j]>arr[j+1]){
                // 进行一次交换
                exchange(j,j+1);

                m = 0; // 数据进行了交换,说明数据还没有达到完全有序状态
            }
        }

        if(m==1){
            break; // 如果m=1,说明数据已经为有序状态,跳出外层循环
        }
    }

}

快速排序:

快速排序是最常用的一种排序算法,因为速度快,效率高而得名。

快速排序采用的是分治思想。

(分治思想其实就是把一个复杂的问题分解成   与原问题性质相同且相互独立的  若干个可以直接求解的小问题。)

快速排序思路:

  在一个给定的数据中,选一个元素作为基准值(这里选择第一个元素),然后先从后往前遍历,找到一个比这个基准值小的元素,把这个元素放到这个基准值的左边,然后再从前往后遍历,找到一个比基准值大的元素,放到这个基准值的右边,直到遍历所有元素。

  当我们遍历一遍数据之后,以这个基准值为基点,分成两组数据量小的数组,然后对这两个数组继续执行上述操作。

Java代码:

public class QuickSort {

    // 快速排序
    public void sort_quick(int[] arr, int first, int last) {
        int start = first;
        int end = last;
        int key = arr[first];
        if (first >= last)
            return;
        int flag = 1; // 是否有序的标记

        while (start < end) {
            while (start < end && arr[end] >= key)
                end--;
            if (start < end) {
                arr[start] = arr[end];
                arr[end] = key;
                start++;
                flag = 0;
            }

            while (start < end && arr[start] <= key)
                start++;

            if (start < end) {
                arr[end] = arr[start];
                arr[start] = key;
                end--;
                flag = 0;
            }
        }

        arr[end] = key;
        if(flag == 1){
            return;
        }

        if (start > first) {
            sort_quick(arr, first, start - 1);
        }

        if (end < last) {
            sort_quick(arr, end + 1, last);
        }

    }
}
时间: 2024-10-13 23:36:54

排序算法之冒泡和快排的相关文章

算法导论学习之快排+各种排序算法时间复杂度总结

快排是一种最常用的排序算法,因为其平均的时间复杂度是nlgn,并且其中的常数因子比较小. 一.快速排序 快排和合并排序一样都是基于分治的排序算法;快排的分治如下: 分解:对区间A[p,r]进行分解,返回q,使得A[p–q-1]都不大于A[q] A[q+1,r]都大于A[q]; 求解:对上面得到的区间继续递归进行快排 合并:因为快排是原地排序,所以不需要特别的合并 从上可以看出最重要的就是分解函数,其按关键值将数组划分成3部分,其具体实现的过程见代码注释. 我们一般取数组的最后一个元素作为划分比较

排序算法-冒泡——插入——快排

冒泡排序,往两个方向泡,一个往小泡,一个网大泡 #include<stdio.h> #include<stdlib.h> #include<time.h> void bubble_sort(int *a,int n){ int temp; for(int i=0;i<n;i++) for(int j=0;j<n-i-1;j++){ if(a[j]>a[j+1]){ temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } } v

Java常见的几种排序算法-插入、选择、冒泡、快排、堆排等

本文就是介绍一些常见的排序算法.排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排序.快速排序(重点).堆排序.归并排序等等.看下图: 给定数组:int data[] = {9,2,7,19,100,97,63,208,55,78} 一.直接插入排序(内部排序.O(n2).稳定) 原理:从待排序的数中选出一个来,插入到前面的合适位置. [java] view plain copy

常见的几种排序算法-插入、选择、冒泡、快排、堆排等

排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排序.快速排序(重点).堆排序.归并排序等等.看下图: 给定数组:int data[] = {9,2,7,19,100,97,63,208,55,78} 一.直接插入排序(内部排序.O(n2).稳定) 原理:从待排序的数中选出一个来,插入到前面的合适位置. package com.xtfggef.algo.sort; public

普林斯顿公开课 算法3-3:三路快排

很多时候排序是为了对数据进行归类,比如对城市进行排序,对员工的职业进行排序.这种排序的特点就是重复的值特别多. 如果使用普通的快排对这些数据进行排序,会造成N^2复杂度,但是归并排序和三路快排就没有这样的问题. 三路快排 三路快排的基本思想就是,在对数据进行分区的时候分成左中右三个部分,中间都是相同的值,左侧小于中间,右侧大于中间. 性能 三路快排的复杂度比普通快排小,主要取决于数据中重复数据的数量.重复数据越多,三路快排的复杂度就越接近于N. 代码 public class Quick3 {

SDUT 3398 数据结构实验之排序一:一趟快排

数据结构实验之排序一:一趟快排 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定N个长整型范围内的整数,要求输出以给定数据中第一个数为枢轴进行一趟快速排序之后的结果. Input 连续输入多组数据,每组输入数据第一行给出正整数N(N < = 10^5),随后给出N个长整型范围内的整数,数字间以空格分隔. Output 输出一趟快速排序后的结果,数字间以一个空格间隔,行末不得有多余空格.

常见排序算法(冒泡、选择、插入、快速、归并C++实现)

常见排序算法(冒泡.选择.插入.快速.归并C++实现) #include <iostream> using namespace std; // 冒泡排序 void bubbleSort (int data[], size_t size) { for (size_t i = 0; i < size - 1; ++i) { bool ordered = true; for (size_t j = 0; j < size - 1 - i; ++j) if (data[j+1] <

SDUT-3398_数据结构实验之排序一:一趟快排

数据结构实验之排序一:一趟快排 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给定N个长整型范围内的整数,要求输出以给定数据中第一个数为枢轴进行一趟快速排序之后的结果. Input 连续输入多组数据,每组输入数据第一行给出正整数N(N < = 10^5),随后给出N个长整型范围内的整数,数字间以空格分隔. Output 输出一趟快速排序后的结果,数字间以一个空格间隔,行末不得有多余空格. Sample Input

排序算法-(冒泡、选择、插入算法)

运行效率较慢的三大排序算法:冒泡.选择与插入算法,时间复杂度都为O(n2),运行效率较慢. #python 代码实现如下所示: li=[2,1,4,5,7,8,9,5,3]#冒泡算法(升序算法)O(n2)import randomfrom cal_time import *@cal_timedef bubble_sort(li): for i in range(len(li)-1): #第i趟 exchange=False for j in range(len(li)-i-1): #无序区域为n