数据结构之——交换排序

1.交换排序算法实现

这里的交换排序指的是冒泡排序和快速排序,

其中快速排序的过程可以简单的理解为:选取序列首元素为枢轴值(pivot),然后分别从序列尾部找到第一个小于pivot的元素(A),从序列首部找到第一个大于pivot的元素(B),然后交换此A,B两元素,直至首尾遍历的两指针重合,一趟排序结束。

以下是这两算法的具体实现:

 1 #include<iostream>
 2 using namespace std;
 3 
 4 //声明打印辅助函数
 5 void printArray(int array[], int length);
 6 //声明冒泡排序函数
 7 void BubbleSort(int array[], int lenght);
 8 //声明分割函数,供快速排序函数调用
 9 int Partition(int array[], int low, int high);
10 //声明快速排序函数
11 void QuickSort(int array[], int low, int high);
12 
13 int main()
14 {
15     int array[] = { 12, 3, 6, 4, 27, 9 };
16     int length = sizeof(array) / sizeof(*array);
17 
18     cout << "排序前序列为:" << endl;
19     printArray(array, length);
20 
21     BubbleSort(array, length);
22     cout << endl << "冒泡排序后序列为:" << endl;
23     printArray(array, length);
24     cout << endl;
25 
26     QuickSort(array, 0, length - 1);
27     cout << endl << "快速排序后序列为:" << endl;
28     printArray(array, length);
29     cout << endl;
30 
31     cout <<endl;
32     system("pause");
33     return 0;
34 }
35 
36 void printArray(int array[], int length)
37 {
38     for (int i = 0; i < length; i++)
39     {
40         if (i == length - 1)
41             cout << array[i];
42         else
43             cout << array[i] << ",";
44     }
45 }
46 
47 void BubbleSort(int array[], int lenght)
48 {
49     int tmp;
50     //标记是否发生了交换
51     bool flag;
52     for (int i = 0; i < lenght;i++)
53     {
54         flag = false;
55         for (int j = lenght - 1; j >i; j--)
56         {
57             if (array[j-1]>array[j])
58             {
59                 tmp = array[j - 1];
60                 array[j - 1] = array[j];
61                 array[j] = tmp;
62                 flag = true;
63             }
64         }
65         //一趟排序未发生交换时,表示已经排序已经完成
66         if (flag==false)
67         {
68             return;
69         }
70     }
71 }
72 
73 int Partition(int array[], int low, int high)
74 {
75     int pivot = array[low];
76     while (low<high)
77     {
78         while (low < high && array[high] >= pivot) high--;
79         array[low] = array[high];
80         while (low < high && array[low] <= pivot) low++;
81         array[high] = array[low];
82     }
83     array[low] = pivot;
84     return low;
85 }
86 
87 void QuickSort(int array[], int low, int high)
88 {
89     if (low<high)
90     {
91         int pivot = Partition(array, low, high);
92         QuickSort(array, low, pivot - 1);
93         QuickSort(array, pivot + 1, high);
94     }
95 }

2.关于交换排序的一些结论

(1).为实现快速排序算法,待排序序列宜采用的存储方式为顺序存储。

(2).就平均性能而言,快速排序是目前最好的内部排序算法,但是当要排序的数据已经基本有序时,不宜使用快速排序算法。

(3).快速排序过程构成一棵递归树,递归深度即为递归树的深度,当枢轴值每次将序列等分时,递归树的高为log2n;当枢轴值每次都是子表的最大值或者最小值时,此时递归树退化为单链表,树高为n。

原文地址:https://www.cnblogs.com/zhiyinglky/p/4803926.html