思想:①:用第一个数字与剩余数字中最小的数字进行互换位置
②:用第二个数字与剩余数字中最小的数字进行互换位置
....................
依次类推,每次都将下一个数字与剩余数字中最小的数字进行位置互换,直至排序结束
#include
#define num 3
int main(){
int temp;
int a[num];
for(int i = 0; i < num; i++){
scanf("%d",&a[i]);
}
for(int i = 0; i < num; i++){
for(int j = i; j < num; j++){
if(a[i]>a[j]){
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
for(int i = 0; i < num; i++){
printf("%d\t",a[i]);
}
return 0;
}
核心思想:每次比较数组中相邻两个数组元素的值
①将最小的数字移动到第一个位置,其余数字向后移动一位;
②将剩余数字中最小的移动到第二个位置,其余数字向后移动一位
......................
每次都将剩余数字中的最小数字移动到当前剩余数字的最前方,直到将一组数字从小到大排序为止。
#include
#define num 5
int main(){
int a[num];
int temp;
for(int i = 0; i < num; i++){
scanf("%d",&a[i]);
}
for(int i = 0; i < num; i++){
for(int j = num; j > i;j--){
if(a[j] < a[j-1]){
temp = a[j];
a[j] = a[j-1];
a[j-1] = temp;
}
}
}
for(int i = 0; i < num; i++){
printf("%d ",a[i]);
}
return 0;
}
核心:每一位数与后面的所有数一一比较,将小(大)的放在前面,并用所得的小(大)的数对本轮比较中未比较的数进行比较,将比较的最小(大)的数放在最前面,依次往复,直至最终排序完成
Example:9 6 15 4 2
①比较9和6,9大于6,交换位置,6称为第一个数字,(6 9 15 4 2)
②6小于15,6继续和4比较,4小于6,4和6交换位置(4 9 15 6 2)
③4和2比较,2小于4,4和2换位置(2 9 15 6 4)
...........................
按照相同的方式进行比较,从当前第二个数字9开始,继续和后面的数字进行比较,如果遇到比当前数字小的则交换位置,否则继续比较。
#include
#include
#define num 5
int main()
{
int temp,i,j;
int a[num];
for(i = 0; i < num; i++){
scanf("%d",&a[i]);
}
for(i = 0; i < num-1; i++){
for(j = i+1; j < num;j++){
if(a[i] > a[j]){
temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
}
for(i = 0; i < num; i++){
printf("%d ",a[i]);
}
return 0;
}
抽出一个数,将该数与前面的所有数进行比较。将其插入到比它大的数前面
#include
int main(){
int i;
int temp;
int a[5];
for(i=0; i<5;i++){
scanf("%d",&a[i]);
}
for(i=0;i<5;i++){
t=a[i]; //要插入的值
temp=i-1;
while(temp>=0 && t
取中间元素,分为左半边和右半边,分别从两边开始找,左边找大于中间元素的数,找到后记录下标,右边找小于中间元素的数,找到后记录下标,左右找到一组值后,交换两个数的位置。多次递归比较,得出最终顺序。
#include
int main(){
int i;
int a[5];
for(i=0;i<5;i++){
scanf("%d",&a[i]);
}
void compare(int left,int right,int a[]);
compare(0,4,a);
for(i=0;i<5;i++){
printf("%d\t",a[i]);
}
return 0;
}
void compare(int left,int right,int a[]){
int i,j;
int middle,temp;
i=left;
j=right;
middle=a[(left+right)/2];
do{
while((a[i]middle) && (j>left)) j--; //从右向左找小于中指的数,得到小标j
if(i<=j){
//将找打的数交换位置
temp=a[i];
a[i]=a[j];
a[j]=temp;
i++; //继续返回循环找下一组
j--;
}
}while(i<=j);
if(lefti) compare(i,right,a); //递归右半边
}
选择排序法在排序的过程中需要进行n(n-1)/2此比较,互相交换n-1次。简单易实现,适用于数量较小的排序
最好的情况是正序,只需要比较n-1次,最差的情况是逆序,需要比较n²次,相对稳定,排序列有序时效果较好
正序最快,逆序最慢,排序列有序时效果较好
需要经过n-1次插入,如果数据恰好在应该插入序列的最末端,则不需要移动,排序列有序时效果较好
折半排序法
对于较大的n,折半排序法是速度最快的排序算法。n较小时,此方法较慢。