一学就废的三种简单排序【冒泡、插入、选择】


冒泡排序

排列顺序从前到后或者从后往前都可,本文选择从后到前的顺序,升序排列:比较相邻两个元素,大的放后面,小的放前面,(降序排列反之)第一个for决定排列数组下标为i的元素,第二个for执行i遍比较过程。
点击这里可以看到动画版的冒泡排序【一个很有趣的网站】


算法实现

void sort(int* a,int len){
    
    //冒泡排序,a为数组首地址,len为数组长度
	int temp;
	for(size_t i = len; 0 < i; i--){
    
    //确定数组下标为i的元素
		for(size_t j = 0; j < i; j++){
    
    //执行i遍比较过程
			if(a[j+1] < a[j]){
    
    
				temp = a[j+1];
				a[j+1] = a[j];
				a[j] = temp;
 			}
		}
	}
}

代码实例

#include <iostream>
using namespace std;

void sort(int* a,int len){
    
    
	int temp;
	for(size_t i = len; 0 < i; i--){
    
    //冒泡排序
		for(size_t j = 0; j < i; j++){
    
    
			if(a[j+1] < a[j]){
    
    
				temp = a[j+1];
				a[j+1] = a[j];
				a[j] = temp;
 			}
		}
	}
}

int main(int argc, char const *argv[]) {
    
    
	int n;
	while (cin>>n,n) {
    
    
		int a[n];
		for(int i=0;i < n; i++){
    
    
			cin >> a[i];
		}
		int len = sizeof(a)/sizeof(a[0]);
		sort(a,len);
		for (int i = 0; i < n; i++) {
    
    
			cout << a[i] << " ";
		}
		cout << endl;
	}

}

插入排序

排列顺序从前到后或者从后往前都可,本文选择从前到后的顺序,每次要确定的数组元素的值要先存入一个临时变量中(例如下面的temp),再将它之前的元素与它比较,比它大的都往后移动一位(降序排列操作反之),例如:a[7]={1,3,5,2,4,8,7}中,假设此时已经过3轮排序,该执行第4轮排序时,将2赋值给temp,之后将3,5向后移,然后将temp的值赋给a[2],这样就相当于做了一个将2插入1,3之间的操作。每个元素都做这样一个操作之后,整个数组便完成排序了。

ps:上文的网站也可以看插入排序


算法实现

void sort(int* a,int len) {
    
    //插入排序,升序排列
  int temp,i,j;
  for(i = 1; i < len; i++){
    
    //决定第i个元素
    temp = a[i];//先将要插入的值赋给临时变量防止以数据丢失
    for(j = i; 0 < j; j--){
    
    //执行i遍比较
      if(temp < a[j-1]){
    
    //a[i]之前的元素比temp大的往后移一位
        a[j] = a[j-1];
      }
      else{
    
    
        break;//找到了该插入的位置,退出本层循环,决定下一个元素的位置
      }
    }
    a[j] = temp;//将元素插入到其该存在的位置
  }
}

代码实例

#include<iostream>
using namespace std;

void sort(int* a,int len) {
    
    //插入排序,升序排列
  int temp,i,j;
  for(i = 1; i < len; i++){
    
    //决定第i个元素
    temp = a[i];
    for(j = i; 0 < j; j--){
    
    //执行i-1遍比较
      if(temp < a[j-1]){
    
    
        a[j] = a[j-1];
      }
      else{
    
    
        break;
      }
    }
    a[j] = temp;
  }
}

int main(int argc, char const *argv[]) {
    
    
	int n;
	while (cin>>n,n) {
    
    
		int a[n];
		for(int i=0;i < n; i++){
    
    
			cin >> a[i];
		}
		int len = sizeof(a)/sizeof(a[0]);
		sort(a,len);
		for (int i = 0; i < n; i++) {
    
    
			cout << a[i] << " ";
		}
		cout << endl;
	}
  return 0;
}


选择排序

排列顺序从前到后或者从后往前都可,本文选择从前到后的顺序,每次要确定的数组元素的值要先存入一个临时变量中(例如下面的min),再将它之后的元素与它比较,如果某位置的元素比该位置元素值小(降序排列操作反之),则交换两个位置的元素,并更新min的值,例如:a[7]={1,4,5,3,2,8,7}中,假设此时已经过1轮排序,该执行第2轮排序时,将4赋值给min,之后判定到a[3]时,发现min的值大于a[3](4>3),交换a[1]和a[3]的元素,也就是数组变成了a[7]={1,3,5,4,2,8,7},并更新min的值(min = 3),接下来继续往后比较时发现min的值大于a[4] (3>2),则重复之前的操作,交换a[1]与a[4]的内容,也就是数组变成了a[7]={1,2,5,4,3,8,7},并更新min的值(min = 2),之后再无数组元素值小于min,遍历完成,一轮排序结束。每个位置(除了最后一个位置,其他位置排好了之后,最后一个位置的元素自然而然就排好了)都做这样一个操作之后,整个数组便完成排序了。
ps:上文的网站也可以看选择排序


算法实现

void sort(int* a,int len) {
    
    //选择排序,升序排列
  int min,i,j;
  for(i = 0; i < len-1; i++){
    
    //确定数组下标为i的元素
    min = a[i];//min作为临时变量存储当前最小的值
    for(j = i+1; j < len; j++){
    
    //执行n-i-1遍比较
      if(min > a[j]){
    
    //如果j位置的元素比i位置元素值小,则交换两个位置的元素,并更新min的值
        a[i] = a[j];
        a[j] = min;
        min = a[i];
      }
    }
  }
}

代码实例

#include<iostream>
using namespace std;

void sort(int* a,int len) {
    
    //选择排序,升序排列
  int min,i,j;
  for(i = 0; i < len-1; i++){
    
    //确定数组下标为i的元素
    min = a[i];//min作为临时变量存储当前最小的值
    for(j = i+1; j < len; j++){
    
    //执行n-i-1遍比较
      if(min > a[j]){
    
    
        a[i] = a[j];
        a[j] = min;
        min = a[i];
      }
    }
  }
}

int main(int argc, char const *argv[]) {
    
    
	int n;
	while (cin>>n,n) {
    
    
		int a[n];
		for(int i=0;i < n; i++){
    
    
			cin >> a[i];
		}
		int len = sizeof(a)/sizeof(a[0]);
		sort(a,len);
		for (int i = 0; i < n; i++) {
    
    
			cout << a[i] << " ";
		}
		cout << endl;
	}
  return 0;
}

猜你喜欢

转载自blog.csdn.net/Jormungand_V/article/details/108996758