一、简单选择排序算法的思想很简单,在待排序的数组中,选择最大(或者最小的)与第一个元素进行交换,然后在剩下的元素中选择次大的(次小的)与第二个元素进行交换,以此类推,直到最后两个元素比较完成。感觉思想很简单很简单,是我认为所以排序算法里,最好理解的算法,但是就这个程序,居然写了一个小时没写出来,我真的是服了自己,可能是自己现在脑子有点晕,也有可能是真的就是因为自己太菜了,总之,上代码了,真的是要多动手,也要多思考,有想法快点写出来才是真啊,否则思想只是思想而已……
#include<iostream>
#include<iomanip>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <list>
using namespace std;
void SelectionSort(int array[], int n);
void swap(int array[], int size, int x, int y);
void shell_sort(int a[], int arraylength, int n);
int main()
{
int t_array[] = { 70, 30, 40, 10, 80, 20, 90, 100, 75, 60, 45 };
int size_tarray = sizeof(t_array)/sizeof(int);
SelectionSort(t_array, size_tarray);
for (int i = 0; i < size_tarray; i++)
{
cout << t_array[i]<<endl;
}
return 0;
}
void SelectionSort(int array[], int n)//排序算法,将数组作为参数进行传递时,要同时传它的长度。也可以学习用指针或引用的方式操作它呢,刚刚学习C++,暂时还不太会呢
{
for (int i = 0; i < n; i++)
{
int smallest = i;//这里我之前上来就取数据了,其实应该是取下标
for (int j = i+1; j <n; j++)
{
if (array[j]<array[smallest])//这里要很注意,我觉得自己没写出来,最重要一步就是这里卡住了,比较的是数,但是传入和交换的是下标
{
smallest = j;//用一个整型数记录最小的数对应的下标,而不是记录这个数,这一点很重要
}
}
swap(array,n,smallest,i);//最后是通过交换函数,根据下标作为参数,将其实现的
}
}
void swap(int array[],int size,int x, int y)
{
int temp;
temp = array[x];
array[x]= array[y];
array[y] = temp;
}
二、二元选择排序算法
在上面简单的选择排序算法基础上有所改进,在一次比较过程中,同时记录最大值和最小值,分别于两端进行交换,重复此过程。下面是代码:
void BinarySelectionSort(int array[], int n);
void swap(int array[], int size, int x, int y);
int main()
{
int t_array[] = { 70, 30, 40, 100, 80, 20, 90, 100, 75, 60, 45 };
int size_tarray = sizeof(t_array)/sizeof(int);
BinarySelectionSort(t_array, size_tarray);
for (int i = 0; i < size_tarray; i++)
{
cout << t_array[i]<<endl;
}
return 0;
}
void swap(int array[], int size, int x, int y)
{
int temp;
temp = array[x];
array[x] = array[y];
array[y] = temp;
}
void BinarySelectionSort(int array[], int n)
{
for (int i = 0; i < n / 2; i++)
{
int min = i;
int max = n - i - 1;
for (int j = i + 1; j <n - 1 - i; j++)
{
if (array[j]<array[min])
{
min = j;
}
if (array[j]>array[max])
{
max = j;
}
}
swap(array, n, min, i);
swap(array, n, max, n - i-1);
}
}
不过这段代码,对于大部分数组均可以实现排序,但对于上面举例的这个数组,无法实现数组{ 700, 30, 40, 100, 80, 20, 90, 100, 75, 60, 45 }的正确排序,应该考虑情况不够全面造成的,求指教啊!自己往后也要再思考