转载笑话先:
今天出去取快递,在回学校的路上拆开包装准备丢进垃圾桶。
当我靠近垃圾桶时,一个踩三轮的大爷正弯下腰捡垃圾桶旁边的纸箱。
见我靠近,他抬起头对我说了一句可能会影响我终生的话:你捡还是我捡。
好了,写好的希尔排序和快速排序(以及改进后的快速排序)算法如下:
#include <iostream>
using namespace std;
const int maxSize(9);
struct sqlList
{
int data[maxSize];
int length;
};
bool swap(sqlList *L, int i, int j)
{
if( i > L->length || j > L->length)
return false;
if (i != j)
{
L->data[i] = L->data[i] + L->data[j];
L->data[j] = L->data[i] - L->data[j];
L->data[i] = L->data[i] - L->data[j];
}
return true;
}
//希尔排序
void shellSort(sqlList *L)
{
int increment(L->length);
do
{
increment = increment /3 + 1;
for (int i = increment; i < L->length; i++)
{
if (L->data[i] < L->data[i - increment])
{
int temp = L->data[i];
int j(0);
for (j = (i - increment); j >= 0 && temp < L->data[j]; j -= increment)
{
L->data[j + increment] = L->data[j];
}
L->data[j + increment] = temp;
}
}
} while (increment > 1);
}
//简单的快速排序
int getFitIndex(sqlList *L, int low, int high)
{
int fitData = L->data[low];
while(low < high)
{
while(low < high && fitData < L->data[high])
high--;
swap(L, low, high);
while(low < high && fitData > L->data[low])
low++;
swap(L, low, high);
}
return low;
}
void QSort(sqlList *L, int low, int high)
{
int fitIndex;
if (low < high)
{
fitIndex = getFitIndex(L, low, high);
QSort(L, low, fitIndex - 1);
QSort(L, fitIndex + 1, high);
}
}
void quickSort(sqlList *L)
{
QSort(L, 0, (L->length - 1));
}
//对快速排序进行升级优化
//优化主要针对三方面:
//一是如何确保选取的fitIndex位于中间位置;
//二是在获取fitIndex时可以省掉某些不必要的操作;
//三是如何减少递归的使用。
int getFitIndex_improved(sqlList *L, int low, int high)
{
//为了确保最终的fitIndex位于中间位置,我们选取了首、末和中间的
//三个元素的中值
int m = low + (high - low) / 2;
if (L->data[low] > L->data[high])
{
swap(L, low, high);
}
if (L->data[m] > L->data[high])
{
swap(L, m, high);
}
if (L->data[m] > L->data[low])
{
swap(L, low, m);
}
int fitData = L->data[low];
while(low < high && L->data[high] > fitData)
high--;
L->data[low] = L->data[high];//这里不再交换数据,而是直接赋值,减少了多余操作
while(low < high && L->data[low] < fitData)
low++;
L->data[high] = L->data[low];//这里不再交换数据,而是直接赋值,减少了多余操作
L->data[low] = fitData;
return low;
}
void QSort_improved(sqlList *L, int low, int high)
{
int fitIndex;
//将if语句改为while语句
while(low < high)
{
fitIndex = getFitIndex_improved(L, low, high);
QSort_improved(L, low, fitIndex - 1);
low = fitIndex + 1;//该语句使得while循环再执行一遍,类似于QSort_improved(L, fitIndex + 1, high);但这种迭代的方式显然比递归要好!
}
}
void quickSort_improved(sqlList *L)
{
QSort(L,0, L->length - 1);
}
int main()
{
//定义线性表并赋值
sqlList *myList = new sqlList;
myList->length = maxSize;
for (int i=0; i < myList->length; i++)
{
cin>>myList->data[i];
}
//排序
//shellSort(myList);//希尔排序
//quickSort(myList);//简单的快速排序
quickSort_improved(myList);//改进的快速排序
//输出排序结果
for (int i=0; i < myList->length; i++)
{
cout<<myList->data[i]<<" ";
}
return 0;
}