排序算法之交换排序

首先,上脑图。

1、为什么要学习排序算法?

这是算法学习的基础,经典的排序算法有着很广泛的用途,一遍遍的被人所使用。而且,在面试找工作的时候,数据结构中的排序算法,也是一个很重要的基本功,经常会被用人单位拿来出题目。

2、如何学习排序算法?

第一步是理解排序算法的原理,这也是最重要的一步。

第二步就是看经典的算法实现,抠细节一个个理解原理到实现经过了哪些变化。

第三部是用纸把算法实现抄一遍,这个时候会发掘出认识和实际的偏差。

第四步是把算法默写出来,这也是很重要的一步,类似于牛吃了食物之后的反刍过程,会进一步加深对于算法的理解。

第五步,将算法代码用各种语言实现出来,并且体会不同语言实现起来的差异。

第六步就是做总结和分享,进一步加深印象,并有助于以后再回过头来看。

3、交换排序算法原理分析

比较典型的交换排序算法有两个,分别是冒泡排序和快速排序。冒泡排序,主要的思想为每次排好一个最大的(或最小的)数,然后在剩下的数据里面继续这个排序最大数(最小数)的过程,直到所有数据都有序为止。冒泡排序的时间复杂度是O(n2)。冒泡排序的特点是,实现简单,但是效率低下。

快速排序,主要的思想为每次挑选一个数,和剩下的数依次做比较,比这个数要大的数据放在这个数据的后面位置,比这个数小的放在前面的位置。一轮过后,就找到这个数在全体数据中的位置。接下来,用同样的方法分别递归这个数的左边和右边。最后得到一个有序数组。快速排序的时间复杂度为O(n logn)。快速排序的特点是,实现复杂,时间复杂度低。

最后,上代码,先是冒泡排序:

 1 public class Maopao {
 2
 3     /**
 4      * @param args
 5      */
 6     public static void main(String[] args) {
 7         // TODO Auto-generated method stub
 8         int num[]={10,9,8,7,6,5,4,3,2,1};
 9         new Maopao().maopao(num);
10         for(int i=0;i<num.length;i++){
11             System.out.print(num[i]+",");
12         }
13     }
14     public void maopao(int num[]){
15         int i,j,temp;
16         for(i=0;i<num.length-1;i++){
17             for(j=0;j<num.length-1-i;j++){
18                 if(num[j]>num[j+1]){
19                     temp=num[j];
20                     num[j]=num[j+1];
21                     num[j+1]=temp;
22                 }
23             }
24         }
25     }
26
27 }

然后是快排:

 1 public class Qsort {
 2
 3     /**
 4      * @param args
 5      */
 6     public static void main(String[] args) {
 7         // TODO Auto-generated method stub
 8         int num[]={0,10,9,8,7,6,5,4,3,2,1};
 9         new Qsort().Qsot(num);
10         for(int i=1;i<num.length;i++){
11             System.out.print(num[i]+",");
12         }
13     }
14     int partition(int num[],int low,int high){
15         num[0]=num[low];
16         int p=num[low];
17         while(low<high){
18             while(low<high && num[high]>=p)high--;
19             num[low]=num[high];
20             while(low<high && num[low]<=p)low++;
21             num[high]=num[low];
22         }
23         num[low]=num[0];
24         return low;
25     }
26     public void QuickSort(int num[],int low,int high){
27         if(low<high){
28             int p = partition(num,low,high);
29             QuickSort(num,p+1,high);
30             QuickSort(num,low,p-1);
31         }
32     }
33     public void Qsot(int num[]){
34         QuickSort(num,1,num.length-1);
35     }
36 }
时间: 2024-10-01 10:01:43

排序算法之交换排序的相关文章

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

相关知识 1. 稳定排序和非稳定排序: 稳定排序算法会依照相等的关键(换言之就是值)维持纪录的相对次序. 如果排序算法是稳定的,就是当有两个有相等关键的纪录R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前. 2. 内排序和外排序 在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序: 在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序. 3.算法分类 排序算法从理论上分为如下几类: (1) 交换排序法:

八大排序算法之五--交换排序—冒泡排序(Bubble Sort)

基本思想: 在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换. 算法实现:(HDU 1040 亲测 AC) #include<iostream> using namespace std; const int N =1005; void BubbleSort(int a[],int ); void print(int a[],int num); vo

1)①排序算法之交换排序[2]快速排序

1 #include<iostream> 2 using namespace std; 3 4 //************快速排序法********* 5 int partiton(int array[10],int s,int t,int &cutpoint){ 6 int x=array[s]; 7 int i,j; 8 i=s; 9 j=t; 10 while(i!=j){ 11 while(i<j&&array[j]>x)j--; 12 if(i&

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

排序算法四:交换排序之冒泡排序

排序算法四:交换排序之冒泡排序 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 引言 在我的博文<"主宰世界"的10种算法短评>中给出的首个算法就是高效的排序算法.本文将对排序算法做一个全面的梳理,从最简单的"冒泡"到高效的堆排序等. 系列博文的前三篇讲述了插入排序的三种不同类型,本文讲述第二大类的排序算法:交换排序,包括冒泡排序和快速排序. 排序相关的的基本概念 排序:将一组杂乱无章的数据按一定的规律顺次排列起

排序算法(三)——交换排序

前两篇文章中介绍了选择排序和插入排序,今天我们继续往下来介绍其他的排序算法,介绍交换排序中的冒泡排序和快速排序. 1.交换排序:冒泡排序 定义:首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则交换这两个记录的值,然后比较第二个记录和第三个记录的关键字,依此类推直至第n-1个记录和第n个记录的关键字比较过为止. 做法:上述过程称为第一趟冒泡排序.其结果是关键字最大的记录被交换到第n个记录的位置.然后进行第二趟冒泡排序,对前n-1个记录进行同样的操作,其结果是关键字次大的记录被交换

内部排序算法(一):交换排序(冒泡排序,快速排序)

这是我的博文系列<内部排序算法>的第一篇.所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来.所谓内部排序,是指在排序过程中,若整个文件都是放在内存中处理,排序时不涉及数据的内.外存交换(外排序的定义则相反). 内部排序法按照策略可以划分为五类:插入排序.选择排序.交换排序.归并排序和分配排序.待排文件的存储方式采用顺序表(或直接用向量)作为存储结构(其他的存储结构还有以链表作为存储结构等). 在这个系列的博文中,我按照排序算法的给出,排序算法的分析(包括算法的时空复杂度

常见的排序算法(二) 交换排序(冒泡排序,快速排序)

今天,给大家带来的是交换排序. 首先,我们来了解一下什么叫交换排序.所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动.   那么接下来,我们来看一下.冒泡排序. 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排

[Java]排序算法&gt;交换排序&gt;【冒泡排序】(O(N*N)/稳定/N较小/有序/顺序+链式)

1 冒泡排序 1.1 算法思想 交换排序的基本思想:两两比较待排序记录的关键字,一旦发现2个记录不满足次序要求时,则:进行交换,直到整个序列全部满足要求为止. 1.2 算法特征 属于[交换排序] 冒泡排序 快速排序 适用于[稳定性]:稳定 适用于[规模N]:较小 适用于[有序性]:有序 适用于[存储结构]:顺序存储 or 链式存储(二者均可) 相关口诀:[插冒归堆]好有序,[插冒]记录个数小,[插冒二选]时N方 1.3 算法实现 import java.util.Arrays; public c