[排序算法] 交换排序(2种)

1.冒泡排序

【思想】不停地比较相邻的记录,如果不满足排序要求就交换相邻数据,直到所有的记录都已经排好序

【特点】稳定

 空间代价:O(1)

 时间代价:O(n^2)

 -比较次数        -交换次数 

·最少:O(n)      ·最少:0

·最多:O(n^2)     ·最多:O(n^2)

 1 void BubbleSort(int Array[], int n)
 2 {
 3     bool NoSwap;            // 是否发生了交换的标志
 4     int i, j;
 5     for(i = 0; i < n-1; i ++)
 6     {
 7         NoSwap = true;        // 标志初始为真
 8         for(j = n - 1; j > i; j --)
 9             if(Array[j] < Array[j-1])  // 判断是否逆置
10             {
11                 swap(Array[j], Array[j - 1]);    // 交换逆置对
12                 NoSwap = false;    // 发生了交换,标志变为假
13             }
14         if (NoSwap) return;        // 没发生交换,则排好序
15     }
16 }

2.快速排序

【思想】基于分治法的排序

·选择轴值(pivot)

·将序列划分为两个子序列L和R,使得L中的所有记录都小于或等于轴值,R中的记录都大于轴值

·对子序列L和R递归进行快速排序

【特点】不稳定

 空间代价:O(logn)

 时间代价:O(nlogn)

分治策略的基本思想:

 -分 -- 划分子问题

 -治 -- 求解子问题(子问题不重叠)

 -合 -- 综合解

轴值选择:

·尽可能使L,R长度相等

·选择策略:

 -选择最左边记录(第一个记录)

  -随机选择

  -选择平均值

分割过程(整个快速排序的关键):

·分割算法1

(1)备份轴值(首记录)

(2)取两个指针low和high,初始值就设为第二个元素和最后一个元素的下标,low <= high

(3)移动两个指针

  ·从high所指位置向左搜索,找到第一个比轴值小的元素

  ·从low所指位置向右搜索,找到第一个比轴值大的元素

(4)交换low和high两位置的值

(5)重复(3)、(4)两步骤的过程,直到low > high

(6)把轴放在high所指的位置

 1 int Partition1(int Array[], int first, int last)
 2 {
 3     int low = first + 1,high = last;
 4     int pivot = Array[first];
 5     while(low <= high)
 6     {
 7         while(low <= high && Array[low] <= pivot) low++;
 8         while(low <= high && Array[high] > pivot) high --;
 9         if(low < high)
10             swap(Array[high--] , Array[low++]);
11     }
12     swap(Array[first],Array[high]);
13     return high;
14 }
15 void QSort(int Array[], int first, int last)
16 {
17     if(first < last)
18     {
19         int x = Partition1(Array,first,last);
20         QSort(Array,first,x - 1);
21         QSort(Array,x + 1,last);
22     }
23 }

·分割算法2

(1)备份轴值(首记录)

(2)取两个指针low和high,初始值就是序列两端的下标,保证low <= high

(3)移动两个指针

  ·从high所指位置向左搜索,找到第一个比轴值小的元素,将其放在low的位置

  ·从low所指位置向右搜索,找到第一个比轴值大的元素,将其放在high的位置

(4)交换low和high两位置的值

(5)重复(3)、(4)两步骤的过程,直到low = high

(6)把轴放在low所指的位置

 1 int Partition2(int Array[], int first, int last)
 2 {
 3     int low = first, high = last;
 4     int pivot = Array[first];
 5     while(low < high)
 6     {
 7         while(low <= high && Array[high] >= pivot) high --;
 8         Array[low] = Array[high];
 9         while(low < high && Array[low] <= pivot) low ++;
10         Array[high] = Array[low];
11     }
12     Array[low] = pivot;
13     return low;
14 }
15 void QSort(int Array[], int first, int last)
16 {
17     if(first < last)
18     {
19         int x = Partition2(Array,first,last);
20         QSort(Array,first,x - 1);
21         QSort(Array,x + 1,last);
22     }
23 }

 

posted @ 2017-03-01 17:53  Strawberry丶  阅读(1977)  评论(0编辑  收藏  举报