目录
1.冒泡排序
起泡排序的思想非常简单。首先,将 n 个元素中的第一个和第二个进行比较,如果两个元素的位置为逆序,则交换两个元素的位置;进而比较第二个和第三个元素关键字,如此类推,直到比较第 n-1 个元素和第 n 个元素为止。
Java实现代码如下:
public static void bubbleSort(int arr[]) {
for(int i=0;i<arr.length-1;i++)//外层控制循环次数
for(int j = 0;j<arr.length -i -1;j++) {
if(arr[j]>arr[j+1]) {
arr[j] = arr[j]+arr[j+1];
arr[j+1] = arr[j]-arr[j+1];
arr[j] = arr[j]-arr[j+1];
}
}
}
2.快速排序
快速排序是将分治法运用到排序问题中的一个典型例子,快速排序的基本思想是:通过一个枢轴(pivot)元素将 n 个元素的序列分为左、右两个子序列 Ll 和 Lr,其中子序列 Ll 中的元素均比枢轴元素小,而子序列 Lr 中的元素均比枢轴元素大,然后对左、右子序列分 别进行快速排序,在将左、右子序列排好序后,则整个序列有序,而对左右子序列的排序过程直到子序列中只包含一个元素时结束,此时左、右子序列由于只包含一个元素则自然有序。
用分治法的三个步骤来描述快速排序的过程如下:
1. 划分步骤:通过枢轴元素 x 将序列一分为二, 且左子序列的元素均小于 x,右子序列的元素均大于 x;
2. 治理步骤:递归的对左、右子序列排序;
3. 组合步骤:无
从上面快速排序算法的描述中我们看到,快速排序算法的实现依赖于按照枢轴元素 x 对待排序序列进行划分的过程。
对待排序序列进行划分的做法是:使用两个指针 low 和 high 分别指向待划分序列 r 的范围,取 low 所指元素为枢轴,即 pivot = r[low]。划分首先从 high 所指位置的元素起向前逐一搜索到第一个比 pivot 小的元素,并将其设置到 low 所指的位置;然后从 low 所指位置 的元素起向后逐一搜索到第一个比 pivot 大的元素,并将其设置到 high 所指的位置;不断重复上述两步直到 low = high 为止,最后将 pivot 设置到 low 与 high 共同指向的位置。使用上述划分方法即可将待排序序列按枢轴元素 pivot 分成两个子序列,当然 pivot 的 选择不一定必须是 r[low],而可以是 r[low..high]之间的任何数据元素。
Java实现代码如下:
private static int partition(int arr[],int low,int high) {//治理
int pivot = arr[low];
while(low<high) {
while(low<high&&arr[high]>=pivot) high--;
arr[low] = arr[high];
while(low<high&&arr[low]<=pivot) low++;
arr[high] = arr[low];
}
arr[low]=pivot;
return low;
}
public static void quickSort(int arr[],int low,int high) {//递归排序
if(low<high) {
int pa = partition(arr, low, high);
quickSort(arr, low, pa-1);
quickSort(arr, pa+1, high);
}
}
3.总结
冒泡排序时间复杂度为O(n2),是一种稳定的排序算法;快速排序时间复杂度为O(N*logN),不稳定。选取10万个随机整数排序耗时测试如图: