常用排序算法实现[交换排序之冒泡排序、快速排序]

相关知识

1. 稳定排序和非稳定排序:

稳定排序算法会依照相等的关键(换言之就是值)维持纪录的相对次序。

如果排序算法是稳定的,就是当有两个有相等关键的纪录R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前。

2. 内排序和外排序

在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序;

在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序。

3.算法分类

排序算法从理论上分为如下几类:

(1) 交换排序法: 冒泡排序快速排序

(2) 选择排序法: 选择排序堆排序、循环排序等

(3) 插入排序法: 插入排序希尔排序、二叉查找树排序等

(4) 归并排序法: 归并排序、Strand排序等

(5) 分布排序法: 基数排序、桶排序、计数排序等。

(6) 混合排序法: 反移排序、Tim排序等

下面主要针对常见的排序算法进行分析

一:冒泡排序

算法思想:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。

可以分为“大数沉底法”和“小数上浮法”两种不同的形式。

时间复杂度:O(n^2)

稳定性:        稳定排序

算法实现:

(1)大数沉底法

void bubble_sort(int array[], int n)
{
	int i, j, temp;
	for(i = 0; i < n-1; i++)
	{
		for(j = 0; j < n -i; j++)
		{
			if(array[j] > array[j+1])
			{
				temp = array[j];
				array[j] = array[j+1];
				array[j+1] = temp;
			}
		}
	}
}

(2)小数上浮法

void bubble_sort(int array[], int n)
{
	int i, j, temp;
	for(i = 0; i < n-1; i++)
	{
		for(j = n - 1; j > i; j--)
		{
			if(array[j] < array[j-1])
			{
				temp = array[j];
				array[j] = array[j-1];
				array[j-1] = temp;
			}
		}
	}
}

(3)改进算法

若在某一趟排序中未发现有位置的交换,则说明待排序的无序区均满足轻者在上,重者在下的原则,因此,冒泡排序过程可在此趟排序后终止。因此,改进的算法中,引入一个布尔量exchange,在每趟排序开始前,先将其置为0。若排序过程中发生了交换,则将其置为1。各趟排序结束时检查exchange,若未曾发生过交换则终止算法,不再进行下一趟排序。

//array[0 .. n-1]是待排序的文件,采用自上向下扫描,对array做冒泡排序
void bubble_sort(int array[], int n)
{
	int i, j, temp;
	int exchange = 0; //交换标志
	for(i = 0; i < n-1; i++) //最多做n-1趟排序
	{
		exchange = 0; //本趟排序开始前,交换标志应为假
		for(j = 0; j < n - i; j++) //对当前无序区array[0 .. n-i]自上向下扫描
		{
			if(array[j] > array[j+1])
			{
				temp = array[j];
				array[j] = array[j+1];
				array[j+1] = temp;
				exchange = 1;  //发生了交换,故将交换标志置为真
			}
		}
		if(!exchange) //本趟排序未发生交换,提前终止算法
			return;
	}
} 

二:快速排序

算法思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

时间复杂度:O(nlog2n)

稳定性:        不稳定排序

算法实现:

void quick_sort(int s[], int low, int high)
{
    if (low < high)
    {
        int i = low, j = high, x = s[low];
        while (i < j)
        {
            while(i < j && s[j] >= x) // 从右向左找第一个小于x的数
                  j--;
            if(i < j)
                  s[i++] = s[j];

            while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数
                  i++;
            if(i < j)
                  s[j--] = s[i];
        }
        s[i] = x;  /*一遍扫描完后,放到适当位置*/
        quick_sort(s, low, i - 1);  /*对基准点左边的数再执行快速排序*/
        quick_sort(s, i + 1, high); /*对基准点右边的数再执行快速排序*/
    }
}

常用排序算法实现[交换排序之冒泡排序、快速排序]

时间: 2024-10-04 07:35:37

常用排序算法实现[交换排序之冒泡排序、快速排序]的相关文章

常用排序算法总结1一一冒泡排序

前言 排序算法是一种能将一串数据依照特定排序方式进行排列的一种算法.最常用到的排序方式是数值顺序以及字典顺序. 有效的排序算法在一些算法(例如搜索算法与合并算法)中是重要的,如此这些算法才能得到正确解答.排序算法也用在处理文字数据以及产生人类可读的输出结果.基本上,排序算法的输出必须遵守下列两个原则: 输出结果为递增序列(递增是针对所需的排序顺序而言) 输出结果是原输入的一种排列.或是重组 排序算法分类 在计算机科学所使用的排序算法通常被分类为: 计算的时间复杂度(最差.平均.和最好性能),依据

1)①排序算法之交换排序[1]冒泡排序法

1 #include "iostream" 2 using namespace std; 3 4 //************冒泡排序法********* 5 int bubble_sort(int n,int array[100]){ 6 bool exchange; 7 int i,j,temp; 8 i=1; 9 do{ 10 exchange=false; 11 for(j=n-1;j>=i;j--){ 12 if(array[j]<array[j-1]){ 13

常用排序算法之——快速排序

快速排序的原理: 首先找一个标兵值,等于某一个元素值:遍历数组,将数组分为小于标兵值和大于标兵值的两部分:然后分别对两个部分采用快速排序,递归. 分开数组时,维持一个指针,指向已找到小部分的最后一个元素:一个指针用于遍历. 不稳定排序算法.当数组已经有序时,时间复杂度最差,为O(N2),平均.最优情况下都为O(N lgN). 代码如下: 1 #include <iostream> 2 using namespace std; 3 4 template<typename T> 5 v

Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法

Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序. 先来看看 8种排序之间的关系: 1.直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2]

常用排序算法比较与分析

一.常用排序算法简述 下面主要从排序算法的基本概念.原理出发,分别从算法的时间复杂度.空间复杂度.算法的稳定性和速度等方面进行分析比较.依据待排序的问题大小(记录数量 n)的不同,排序过程中需要的存储器空间也不同,由此将排序算法分为两大类:[内排序].[外排序]. 内排序:指排序时数据元素全部存放在计算机的随机存储器RAM中. 外排序:待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中还需要对外存进行访问的排序过程. 先了解一下常见排序算法的分类关系(见图1-1) 图1-1 常见排

常用排序算法小结

1 #include <stdio.h> 2 #include <stdlib.h> 3 4 5 //the basic bubble sort 6 void maopao1(int *num,int len) 7 { 8 int i,j; 9 int temp; 10 for (i = 0; i < len-1; ++i) 11 { 12 for (j = i+1; j<len; ++j) 13 { 14 if (num[i]>num[j]) 15 { 16 t

七种常用排序算法

七种常用排序算法 一.常见排序算法一览: 时间复杂度: 是一个函数,它定量描述了该算法的运行时间. 空间复杂度:一个算法在运行过程中临时占用存储空间大小的量度. 稳定性:保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同就稳定,反之不稳定. 视觉直观感受 7 种常用的排序算法 二.算法C#实现: 1. 直接插入排序: using System; using System.Collections.Generic; using System.Linq; using Sys

Java 常用排序算法/程序员必须掌握的 8大排序算法

Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序. 先来看看 8种排序之间的关系: 1.直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排 好顺序的,现在要把第n 个数插到前

几种常用排序算法 (一)

八大常用排序算法详细分析 包括复杂度: 排序有可以分为以下几类: (1).交换排序:冒泡排序.快速排序 (2).选择排序:直接选择排序.堆排序 (3).插入排序:直接插入排序.希尔排序 (4).归并排序 (5).基数排序(桶排序) 1.冒泡排序 顾名思义,冒泡排序就是用气泡从下往上冒的原理,将气泡(较小或较大的数)依次往前移. 具体做法(升序):设总共有N个元素,则至少需要进行N-1次冒泡.一次排序排序中,若前一个元素大于后一个元素,则交换两个元素,然后在依次判  断后面两两相邻元素大小并进行交