排序——交换排序

来源:互联网 发布:容声冰箱 知乎 编辑:程序博客网 时间:2024/06/01 09:09
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         else43             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。

 

2 0
原创粉丝点击