公司企业建站,wordpress 发布api,phpcms v9网站性能优化,小程序 wordpressFrom: http://www.diybl.com/course/6_system/linux/Linuxjs/20091028/180420.html 排序算法一直都是让我头疼的算法。为了全面掌握排序算法#xff0c;我就整理了常用的排序算法。 首先我们来了解一些基本概念#xff1a; #xff08;1#xff09;稳定排序和非稳定排序 简…From: http://www.diybl.com/course/6_system/linux/Linuxjs/20091028/180420.html 排序算法一直都是让我头疼的算法。为了全面掌握排序算法我就整理了常用的排序算法。 首先我们来了解一些基本概念 1稳定排序和非稳定排序 简单地说就是所有相等的数经过某种排序方法后仍能保持它们在排序之前的相对次序我们就 说这种排序方法是稳定的。反之就是非稳定的。 比如一组数排序前是a1,a2,a3,a4,a5其中a2a4经过某种排序后为a1,a2,a4,a3,a5 则我们说这种排序是稳定的因为a2排序前在a4的前面排序后它还是在a4的前面。假如变成a1,a4, a2,a3,a5就不是稳定的了。 2内部排序和外部排序 在排序过程中所有需要排序的数都在内存并在内存中调整它们的存储顺序称为内排序 在排序过程中只有部分数被调入内存并借助内存调整数在外存中的存放顺序排序方法称为外排序。3算法的时间复杂度和空间复杂度 所谓算法的时间复杂度是指执行算法所需要的计算工作量。 一个算法的空间复杂度一般是指执行这个算法所需要的内存空间。 (1)选择排序算法它是非稳定的。每一趟在n-i1个记录中选取最小的记录作为有序序列的第i的记录。它的算法如下 void choose_sort(int *x, int n)/*x数组名 n为数组长度*/ { int i, j, min, k; for(i 0; i n-1; i){ min i; for(j i1; j n; j){ if(x[min] x[j]) min j; } if(min ! i){ k x[i]; x[i] x[min]; x[min] k; } } }
2直接插入排序将一个记录插入到排好序的记录中从而得到一个新的有序表。它的算法如下void insert_sort(int *x, int n) { int i, j, t; for(i 1; i n; i){ t x[i]; for(j i-1; (j0tx[j]); j--){ x[j1] x[j]; } x[j1] t; } }
3快速排序是对冒泡排序的一种改进。它首先需要一个函数Partition()将要排序的记录以low为中心分成两个部分比x[low]下小的放low前面比x[low]大的放low后面。假设第一趟分成了如下两部分 x[s],x[s1]...x[i-1]和x[i1],x[i1]...x[t] 可以看书lowi. 之后我们这两部分再进行Partition()函数排序。 Partition(int *x, int low, int high)解析 我们从high开始逆序找从low开始顺序找最后low等于high后便退出这一趟排序。代码如下 int Partition(int *x, int low, int high) { int key; key x[low]; while(low high){ while((low high) x[high] key) high--; x[low] x[high]; while((low high) x[low] key) low; x[high] x[low]; } x[low] key; return low; }
递归对所有被分割的序列排序void QSort(int *x, int low, int high) { int key_i; if(low high){ key_i Partition(x, low, high); QSort(x, low, (key_i-1)); QSort(x, (key_i1), high); } }
最后完成该函数void QuickSort(int *x, int n) { QSort(x, 0, (n-1)); }