写于2013年8月29号
自己学会常见的这几种算法,并整理成文。
代码实现
名词解释
时间复杂度:算法占用的时间(一般与数据数量呈正相关)。
空间复杂度:算法占用的空间(一般与数据数量呈正相关)。
算法稳定性:是指是否会交换值相等的两个数据的初始位置。
一.冒泡排序 Bubble Sort
冒泡排序(BubbleSort)是一种入门级别的算法,较好理解。一般作为第一种算法被认识。
冒泡排序是一种稳定的排序。
平均时间按复杂度O(n*n) 【最好时间复杂度O(n),最坏时间复杂度O(n*n)】
空间复杂度O(1)
算法的运作如下:
1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2、对每一对相邻元素重复步骤1,从开始第一对到结尾的最后一对。每趟过后,排在最后的元素最大。
3、重复步骤2,直到剩下一个元素。
代码:
代码:
1 for(int i=0;i<n-1;i++) //n-1趟排序
2 {
3 for(int j=n-1;j>i;j--) //j>i因为i前面的元素已经排好了
4 {
5 int temp=0;
6 if(arrayA[j]<arrayA[j-1]) //比较相邻的两个元素,见步骤1
7 {
8 temp=arrayA[j];
9 arrayA[j]=arrayA[j-1];
10 arrayA[j-1]=temp;
11 }
二、选择排序Selection Sort
选择排序其实是冒泡的升级,每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
冒泡排序是一种稳定的排序。
平均时间按复杂度O(n*n) 【最好最坏均是O(n*n)】
空间复杂度O(1)
算法运作如下:
1、比较所有待排序元素。找到最小(最大)的元素。
2、将这个元素放入已排序数列的最后。
3、持续每次对待排序元素重复上面的步骤,直到没有待排序元素。
代码:
1 for(int i=0;i<n-1;i++) //n-1趟排序,因为最后只剩一个元素的时候不用再比较
2 {
3 int index=i; //索引值,记录当前已排序数列排列到的位置
4 for(int j=i+1;j<n;j++) //j从i+1开始,因为前面的元素已经排好了
5 {
6 if(arrayA[j]<arrayA[index])
7 index=j; //每趟将待排序数据中的最小值的位置存放到index
8 }
9
10 //若该趟index指向的的最小值不在i处(最前面),则交换array[index]和array[i]的值
11 if (index!=i)
12 {
13 //交换数据
14 int temp = arrayA[i];
15 arrayA[i] = arrayA[index];
16 arrayA[index] = temp;
17 }
18 }
三、快速排序QuickSort
快速排序是对冒泡排序的一种改进。
快速排序是一种不稳定的排序。
平均时间按复杂度O(nlogn) 【最好时间复杂度O(nlogn),最坏时间复杂度O(n*n)】
空间复杂度O(nlogn)