常见排序算法总结
冒泡排序:
冒泡排序介绍:
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换的元素,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,就像冒泡一样,因此称之为冒泡排序。
冒泡排序算法原理:
1、比较相邻的两个元素。如果第一个元素比第二个元素大,就交换他们两个元素。
2、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。按照这个策略执行一趟后,最后的元素会是最大的数。
3、将最后一个元素排除在外,针对其余的所有元素重复以上两步的操作步骤。
4、持续对越来越少的元素重复上面的操作步骤,直到没有任何一对元素需要比较。
冒泡排序最好的时间复杂度为O(N),最坏的时间复杂度为O(N²),因此冒泡排序总的平均时间复杂度为O(N²)。
/** * 冒泡排序算法实现 * @param destArray 待排序的无序数组 如:65 27 59 64 58 */ public static void bubbleSort(int[] destArray) { for(int i = 0;i < destArray.length;i++) { for(int j = i;j < destArray.length;j++) { if(destArray[j] < destArray[i]) { int temp = destArray[i]; destArray[i] = destArray[j]; destArray[j] = temp; } } } }
快速排序:
快速排序介绍:
快速排序(Quick Sort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
快速排序算法原理:
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
一趟快速排序的算法是:
1、设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2、以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3、从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4、从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5、重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i,j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
快速排序最好的时间复杂度为O(NlogN),最坏的时间复杂度为O(N²),因此快速排序总的平均时间复杂度为O(NlogN)。
/** * 快速排序算法实现 * @param destArray 待排序的无序数组 如:65 27 59 64 58 * @param low 数组的低index * @param high 数组的高index */ public static void quickSort(int[] destArray, int low, int high) { if(low >= high) { return; } int first = low; int last = high; int key = destArray[first]; while(first < last) { while(first < last && destArray[last] >= key) { last--; } destArray[first] = destArray[last];//将比第一个小的移到低端 while(first < last && destArray[first] <= key) { first++; } destArray[last] = destArray[first]; } destArray[first] = key; quickSort(destArray, low, first - 1); quickSort(destArray, first + 1, high); }
插入排序:
插入排序介绍:
插入排序(Insert Sort)它的基本思想是:输入一个元素,检查数组列表中的每个元素,将其插入到一个已经排好序的数列中的适当位置,使数列依然有序,当最后一个元素放入合适位置时,该数组排序完毕。
插入排序算法原理:
输入一个数,插入一个各元素已经按照升序排列的数组中,插入后使数组中元素仍然是按照升序排列的。思想:把欲插入的数与数组中各数逐个比较,当找到第一个比插入数大的元素i时,该元素之前即为插入位置。然后从数组最后一个元素开始到该元素为止,逐个后移一个单元。最后把插入数赋予元素a[i]即可。如果被插入数比所有的元素值都小则插入最前位置。
插入排序最好的时间复杂度为O(N),最坏的时间复杂度为O(N²),因此冒泡排序总的平均时间复杂度为O(N²)。
/** * 插入排序算法实现(由前向后) * @param destArray 待排序的无序数组 如:65 27 59 64 58 */ public static void insertSort(int[] destArray) { //从第2个数据开始插入,因此这里从i=1开始 for(int i = 1;i < destArray.length;i++) { int j = 0; //寻找要插入的位置 while(j < i && destArray[j] <= destArray[i]) j++; //i位置之前,有比destArray[i]大的数,则进行挪动和插入 if(j < i) { int k = i; int temp = destArray[i]; //挪动位置 while(k > j) { destArray[k] = destArray[k-1]; k--; } destArray[k] = temp;//插入 } } }
上一篇: php的cURL库介绍