八大排序算法之---冒泡和选择

1.交换排序—冒泡排序(BubbleSort)

基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

算法分析:如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次相邻元素的两两比较,在第j趟比较中要进行n-j次两两比较。比较的顺序从前往后,经过一趟比较后,将最值沉底(换到最后一个元素位置),最大值沉底为升序,最小值沉底为降序。

void bubbleSort(int a[], int n){

for(int i=0;i< n-1;++i){   /*外循环控制排序趟数,n个数排n-1趟*/

for(int j=0;j < n-i-1; j++){    /*内循环每趟比较的次数,第j趟比较n-j次,每次只将一个最大的数沉底*/

if(a[j] > a[j+1]){  /*相邻元素比较,逆序则交换*/

int temp = a[j];

a[j] = a[j+1];

a[j+1] = temp;

}

}

}

}

冒泡排序算法的改进:

对冒泡排序常见的改进方法是加入一标志性变量exchange,用于标志某一趟排序过程中是否有数据交换,如果进行某一趟排序时并没有进行数据交换,则说明数据已经按要求排列好,可立即结束排序,避免不必要的比较过程。本文再提供以下两种改进算法:

1.  设置一标志性变量pos,用于记录每趟排序中最后一次进行交换的位置。由于pos位置之后的记录均已交换到位,故在进行下一趟排序时只要扫描到pos位置即可。

改进后算法如下:

void Bubble_1 ( int r[], int n) {

int i= n -1;    //初始时,最后位置保持不变

while ( i> 0) {

int pos= 0;     //每趟开始时,无记录交换

for (int j= 0; j< i; j++)

if (r[j]> r[j+1]) {

pos= j;    //记录交换的位置

int  temp  =  r[j];

r[j] =  r[j+1];

r[j+1]  =  temp;

}

i= pos;      //为下一趟排序作准备

}

}

算法分析:定义n-1次循环,每个数字比较n-j次,比较前一个数和后一个数的大小。然后交换顺序。

2.传统冒泡排序中每一趟排序操作只能找到一个最大值或最小值,我们考虑利用在每趟排序中进行正向和反向两遍冒泡的方法一次可以得到两个最终值(最大者和最小者), 从而使排序趟数几乎减少了一半。

改进后的算法实现为:

void Bubble_2 ( int r[], int n){

int low = 0;

int high= n -1;    //设置变量的初始值

int tmp,j;

while (low < high) {

for (j= low; j< high; j++)     //正向冒泡,找到最大者

if (r[j]> r[j+1]) {

tmp  =  r[j];

r[j]  =  r[j+1];

r[j+1]  =  tmp;

}

high--;                 //修改high值, 前移一位

for ( j=high; j>low; j++)       //反向冒泡,找到最小者

if (r[j]<r[j-1]) {

tmp  =  r[j];

r[j]  =  r[j-1];

r[j-1]  = tmp;

}

low++;              //修改low值,后移一位

}

}

选择排序—简单选择排序(Simple Selection Sort)

基本思想:在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。

简单选择排序的示例:

操作方法:在要排序的一组数中,选出最小的一个数与第一个位置的数交换; 然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。

第i趟,则从第i 个记录开始的n-i+1个记录中选出关键码最小的记录与第i 个记录交换,直到整个序列按关键码有序。

算法分析:每趟选出一个最值和无序序列的第一个数交换,n个数共选n-1趟。第i趟假设i为最值下标,然后将最值和i+1至最后一个数比较,找出最值的下标,若最值下标不为初设值,则将最值元素和下标为i的元素交换.

算法实现:

void select_sort(int *x, int n) {       /*用指针来实现选择排序*/

int i, j, min, t;

for (i=0; i<n-1; i++) {        /*要选择的次数:0~n-2共n-1次*/

min = i;       /*假设当前下标为i的数最小,比较后再调整*/

for (j=i+1; j<n; j++) {       /*循环找出最小的数的下标是哪个*/

if (*(x+j) < *(x+min)) {

min = j;      /*如果后面的数比前面的小,则记下它的下标*/

}

}

if (min != i)  {          /*如果min在循环中改变了,就需要交换数据*/

t  =  *(x+i);

*(x+i)  =  *(x+min);

*(x+min)  =  t;

}

}

}

(2)核心代码:

for(i=0;i<n-1;i++) {        /*外循环控制趟数,n个数选n-1趟*/

k=i;             /*假设当前趟的第一个数为最值,记在k中*/

for(j=i+1;j<n;j++)      /*从下一个数到最后一个数之间找最值*/

if( a[k] < a[j])      /*若其后有比最值更大的*/

k=j;        /*则将其下标记在k中*/

if( k != i) {    /*若k不为最初的i值,说明在其后找到比其更大的数*/

t = a[k];

a[k] = a[i];

a[i] = t;

}

}

算法特点:每趟是选出一个最值确定其在结果序列中的位置,确定元素的位置是从前往后,而每趟最多进行一次交换,其余元素的相对位置不变。可进行降序排序或升序排序。

算法分析:定义外部n-1次循环,假设第一个为最值,放在参数中,在从下一个数以后找最值若后面有比前面假设的最值更大的就放在k中,然后在对k进行分析。若k部位最初的i值。也就是假设的i不是最值,那么就交换最值和当前序列的第一个数。。。。

时间: 2024-10-23 22:19:29

八大排序算法之---冒泡和选择的相关文章

常见排序算法(冒泡、选择、插入、快速、归并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] <

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

运行效率较慢的三大排序算法:冒泡.选择与插入算法,时间复杂度都为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

时间/空间复杂度,基础排序算法(冒泡、选择、快速、插入)

一.时间复杂度.空间复杂度 时间复杂度:用来评估算法运行效率的一个东西,用O()来表示 举例时间复杂度计算: print('Hello World') O(1) for i in range(n): #n次循环 print('Hello World') O(n) for i in range(n): for j in range(n): #两个n嵌套循环 print('Hello World') O(n²) 以下这些代码时间复杂度呢? print('Hello World') print('He

七大排序算法(冒泡,选择,插入,希尔,快速,合并,堆排序)的java实现

冒泡排序 思路:就是每次将最大或最小的元素放到数组的最后,so easy!时间复杂度为(O(n^2)) public class BubbleSort { public static void bubbleSort(int[] a) { for (int j = 1; j < a.length; j++) { for (int i = 0; i < a.length - j; i++) { if (a[i] > a[i + 1]) { int temp = a[i]; a[i] = a[

排序算法(冒泡,选择,插入,快速)查找算法(二分,快速)

四种排序算法 1.冒泡排序 思路分析:从前往后相邻的两个数一次进行比较,大的往下沉,小的网上 冒.当相邻的两个数的比较后发现他们的排序与排序要求相反,就互换. 代码实现 $arr = array (1,42,33,69,7,82,34,54,70,99); $len = count($arr); For($i=1;$i<$len;$i++){ For($j=0;$j<$len-$i;$j++){ If($arr[$j] > $arr[$j+1]){ $tmp = $arr[$j+1];

python排序算法之冒泡,选择,插入

1.参考 一本关于排序算法的 GitBook 在线书籍 <十大经典排序算法>,使用 JavaScript & Python & Go 实现 2.冒泡排序:两两比较,互换位置 arr = [9,8,2,23,3] # 冒泡排序 两两比较,互换位置 # 3 5 9 1 8 # A B C D E # 3 5 9 1 8 # 3 5 9 1 8 # 3 5 1 9 8 # 3 5 1 8 9 # 第一轮比较将最大数排到最后,5个数总共需要4轮即1,2,3,4 # 比较是arr[j]

数据结构与算法之——八大排序算法

附:关于这个主题,网上好的文章已经数不胜数,本篇是整合后的文章. 正文: 一.概述 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 本文所指八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短: 二.排序算法详述 1.

(转)详解八大排序算法

概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短: 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到

[Data Structure &amp; Algorithm] 八大排序算法

排序有内部排序和外部排序之分,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.我们这里说的八大排序算法均为内部排序. 下图为排序算法体系结构图: 1. 直接插入排序(Straight Insertion Sort ) 基本思想:将待排序的无序数列看成是一个仅含有一个元素的有序数列和一个无序数列,将无序数列中的元素逐次插入到有序数列中,从而获得最终的有序数列. 算法流程: 1)初始时, a[0]自成一个有序区, 无序区为a[1