选择排序:每次从待排序列中找出一个最小值放在已排序序列的末尾位置。改进:每次从待排序列中找出一个最小值和一个最大值,最小值放在已排序序列末尾位置,最大值放在待排序序列末尾位置,并将这个位置指定为已排序位置
普通选择排序
void selectSort(int num, elementType *a) {
/*普通选择排序(升序)*/
int begin = 0;
int end = num - 1;
int minIndex = 0;
while (begin <= end) {
for (int i = begin; i <= end; i++) {
if (*(a + i) < *(a + minIndex)) {
minIndex = i;
}
}
swap(a + begin,a + minIndex);
begin++;
minIndex = begin;
}
}
改进选择排序
void selectSort_new(int num, elementType *a) {
/*改进选择排序(升序)*/
int begin = 0;
int end = num - 1;
int maxIndex = 0;
int minIndex = 0;
while (begin <= end) {
for (int i = begin; i <= end; i++) {
if (*(a + i) > *(a + maxIndex)) {
maxIndex = i;
}
if (*(a + i) < *(a + minIndex)) {
minIndex = i;
}
}
swap(a + begin,a + minIndex);
if(begin == maxIndex){
/*如果最大值在begin位置,则最大值元素会被换到最小值的位置*/
maxIndex = minIndex;
}
swap(a + end,a + maxIndex);
begin++;
end--;
minIndex = begin;
maxIndex = begin;
}
}
代码测试
/*选择排序:每次从待排序列中找出一个最小值放在已排序序列的末尾位置。
* 改进:每次从待排序列中找出一个最小值和一个最大值,最小值放在已排序序列末尾位置,
* 最大值放在待排序序列末尾位置,并将这个位置指定为已排序位置*/
void swap(elementType *a, elementType *b) {
/*交换ab的值*/
elementType temp = *a;
*a = *b;
*b = temp;
}
void selectSort(int num, elementType *a) {
/*普通选择排序(升序)*/
int begin = 0;
int end = num - 1;
int minIndex = 0;
while (begin <= end) {
for (int i = begin; i <= end; i++) {
if (*(a + i) < *(a + minIndex)) {
minIndex = i;
}
}
swap(a + begin,a + minIndex);
begin++;
minIndex = begin;
}
}
void selectSort_new(int num, elementType *a) {
/*改进选择排序(升序)*/
int begin = 0;
int end = num - 1;
int maxIndex = 0;
int minIndex = 0;
while (begin <= end) {
for (int i = begin; i <= end; i++) {
if (*(a + i) > *(a + maxIndex)) {
maxIndex = i;
}
if (*(a + i) < *(a + minIndex)) {
minIndex = i;
}
}
swap(a + begin,a + minIndex);
if(begin == maxIndex){
/*如果最大值在begin位置,则最大值元素会被换到最小值的位置*/
maxIndex = minIndex;
}
swap(a + end,a + maxIndex);
begin++;
end--;
minIndex = begin;
maxIndex = begin;
}
}
void Print(elementType *a, int n) {
for (int i = 0; i < n; i++) {
printf("%.5f\t",*(a + i));
}
}
void test_select(int num, elementType *a) {
std::cout << "\n普通选择排序(升序):\n";
selectSort(num, a);
Print(a,num);
std::cout << "\n改进选择排序(升序):\n";
selectSort_new(num, a);
Print(a,num);
}
测试结果
普通选择排序(升序):
0.235000 1.230000 1.240000 1.890000 3.141593 55.000000
改进选择排序(升序):
0.235000 1.230000 1.240000 1.890000 3.141593 55.000000
进程已结束,退出代码为 0