题目:给一组整数,按照升序排序,使用选择排序,冒泡排序,插入排序或者任何 O(n2) 的排序算法
1、冒泡排序
原理:从第一个整数开始第一趟,比较相邻的两个元素,大的放在后面;一轮结束后,最大的数沉底;重复这一过程,完整n-1趟。
所以有两个循环,外循环决定第几趟、从第几个元素开始比较;内循环是比较相邻两个元素大小,决定要不要交换。
1、冒泡排序
原理:从第一个整数开始第一趟,比较相邻的两个元素,大的放在后面;一轮结束后,最大的数沉底;重复这一过程,完整n-1趟。
所以有两个循环,外循环决定第几趟、从第几个元素开始比较;内循环是比较相邻两个元素大小,决定要不要交换。
class Solution
{
public:/** @param A: an integer array* @return: */void sortIntegers(vector<int> &A){int temp = 0;if(A.size()!=0)//判断是否为空数组{for(int i=0; i<A.size()-1; i++)//外循环只比较A.size()-1趟for(int j=i+1; j<A.size(); j++)//内循环从i+1开始{if(A[i] > A[j]){temp = A[j];//交换A[j] = A[i];A[i] = temp;}}}}
};
2、插入排序
原理:第一趟把第一个元素当做有序序列,用第二个和第一个比,将大的放在后面;第二趟把前两个元素当做有序序列,用第三个元素跟第二个比,大的放后面,再用第二个跟第一个比,大的放后面;第三趟把前三个当做有序序列,用第四个元素跟第三个比,再用第三个跟第二个比,第二个跟第一个比;......以此类推。两个循环,外循环决定从无序序列开始,内循环进行从后往前的两两比较和交换。class Solution
{
public:/*** @param A an integer array* @return void*/void sortIntegers(vector<int>& A) {int temp = 0;for (int i = 1; i < A.size(); ++i) //从第二个元素开始{while (i > 0 && A[i] < A[i - 1])//当该元素前面还有元素,且比前面的数小,就进行下面的交换{temp = A[i];A[i] = A[i-1];A[i-1] = temp;--i;//递减,往前比较}}}
};
3、选择排序
原理:遍历整个数组,对于当前位置i,定义一个变量min_idx,用来记录当前位置往后的最小的坐标,并通过遍历以后所有的数字来找这个最小的坐标;然后交换A[i]和A[min_idx]。
外循环定义当前位置,内循环找到当前往后最小的元素坐标。从第一个元素开始,选择后面元素里面最小的一个和第一个元素交换,直到最后一个元素。
class Solution
{
public:/*** @param A an integer array* @return void*/void sortIntegers(vector<int>& A) { for (int i = 0; i < A.size(); ++i) {int min_idx = i;for (int j = i + 1; j < A.size(); ++j) {if (A[j] < A[min_idx]) {min_idx = j;}}swap(A[i], A[min_idx]);}}
};
参考:
lintcode整数排序