算法实现之交换排序——冒泡与快排

来源:互联网 发布:医药管理系统 源码 编辑:程序博客网 时间:2024/06/03 19:59


冒泡排序

基本思想:

将需要排序的全部元素看成一列,自上而下对相邻两个元素进行比较和调整,让较大的元素往下沉,较小的元素往上冒。也就是如果相邻的两个元素比较后发现与要求的排序顺序相反,则交换他们的位置。元素往上冒的过程类似于水中的气泡,所以叫冒泡排序。

算法实现:

void bubblesort(int a[], int n){for (int i = n-1; i > 0; i--)// 第n-i趟确定地i个位置的元素for (int j = 0; j < i; j++){if (a[j] > a[j + 1])swap(a[j], a[j + 1]);}}


冒泡排序有一种常用的改进方法,就是增加一个标志变量flag,当某一趟冒泡过程没发生一次交换,则说明此时的整个序列已经有序,即可以结束算法。


快速排序

基本思想:

理论上冒泡排序一趟只是确保找到一个元素最终的位置,而快速排序则是在找到一个元素(基准元素)的最终的位置的同时确保基准元素左边的都小于等于它,右边的都大于等于它,从而大大的加速了排序的过程。

步骤:

1、任意选择一个基准元素,通常选第一个或者最后一个

2、将序列分成两部分,左边的都小于等于基准元素,右边的都大于等于基准元素。具体过程如下:

      2.1、从后向前找第一个小于基准元素的元素,找到后交换其与基准元素的位置

      2.2、从前往后找第一个大于基准元素的元素,找到后交换其与基准元素的位置(2.1交换后的位置)

      2.3、执行步骤2.1直到索引发生交叉,说明整个序列已经遍历一趟,此时发生交叉的位置即是基准元素的最终位置。

3、对基准元素的左右两部分分别递归执行步骤1


算法实现:

// 快速排序int partion(int a[], int low, int high){while (low < high){//int key = a[low];while (low < high && a[high] >= a[low])high--;if (low >= high)break;swap(a[low], a[high]);  // 交换后,基准元素在highwhile (low < high && a[low] <= a[high])low++;if (low >= high)break;swap(a[low], a[high]);}return low;}void quicksort(int a[], int low, int high){if (low < high){int pos = partion(a, low, high);quicksort(a, low, pos - 1);quicksort(a, pos + 1, high);}}



0 0
原创粉丝点击