交换排序的基本思想:
两两比较待排序元素,发现倒序则交换。
交换排序包括:
(1)冒泡排序
(2)快速排序
关于交换排序算法的时间复杂度和稳定性请见该博文:http://blog.youkuaiyun.com/learn_sunzhuli/article/details/47068295
算法由C++实现的代码如下,已经在 vs2010上测试通过:
#include <iostream>
using namespace std;
void BubbleSort(int arr[], int len)
{
bool isFinished; //添加标志位,判断排序是否提前结束
for(int i = 0; i < len; i++)
{
isFinished = true;
for(int j = 0; j < len - i - 1; j++)
{
if(arr[j] > arr[j + 1])
{
swap(arr[j], arr[j + 1]);
isFinished = false;
}
}
if(isFinished)
return;
}
}
//cutPoint为引用型变量,因为它的改变值要返回给QuickSort()函数中的实参
void GetCutpoint(int arr[], int startPoint, int endPoint, int& cutPoint)//引用型参数
{
int front = startPoint;
int rear = endPoint;
int currentValue = arr[front];//空出一个位置
while(front != rear)
{
//考虑极端情况,即原序列已经有序、
//思考 front < rear 该判断条件的意义
while(front < rear && arr[rear] > currentValue)
rear--;
if(front < rear)
{
arr[front] = arr[rear];//空出一个位置
front++;
}
while(front < rear && arr[front] < currentValue)
front++;
if(front < rear)
{
arr[rear] = arr[front];
rear--;
}
}
arr[front] = currentValue;
cutPoint = front;
}
void QuickSort(int arr[], int startPoint, int endPoint)//递归排序
{
int cutpoint;
if(startPoint < endPoint)
{
GetCutpoint(arr, startPoint, endPoint, cutpoint);
QuickSort(arr, startPoint, cutpoint - 1);//arr[cutpoint]位置已经确定,不再参与排序
QuickSort(arr, cutpoint + 1, endPoint);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int arr[] = {1, 3, 5, 6, 9, 8, 7, 2, 4, 0};
int len = sizeof(arr) / sizeof(arr[0]);
//BubbleSort(arr, len);
QuickSort(arr, 0, len - 1);
//输出排序后结果
for(int i = 0; i < len; i++)
cout<<arr[i]<<" ";
cout<<endl;
return 0;
}
排序后,数组元素按照从小到大顺序依次输出,由于数组元素已经明确给出,则不在给出排序结果截图。