1、冒泡排序
将相邻两个数比较,将小的数调到前头(0的位置)。如果有n个数,则要进行n-1次比较,在第一趟比较中要进行n-1次两两比较,在第j趟比较中要进行n-j次两两比较。
每一趟过完都能确定一个当前剩下数的位置。
对n个数进行冒泡排序:
代码实现:
void sort(int a[],int n)
{
int i,j,t;
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-1-i;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
2、选择排序
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
选择排序的比较操作为 n (n - 1) / 2 次。
代码实现:
void sort(int a[],int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(a[j]>a[k])
k=j;
}
if(k!=i)
{
t=a[i];
a[i]=a[k];
a[k]=t;
}
}
}
3、插入排序
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,
时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外,
而第二部分就只包含这一个元素。在第一部分排序后,再把这个最后元素插入到此刻已是有序的第一部分里的位置。每次处理就是将无序数列的
第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列的合适位置中。
代码实现:
void sort(int a[],int n)
{
int i,j,t;
for(i=1;i<n;i++)
{
t=a[i];
j=i;
if(a[j-1]>t)
{
while(j>=1 && a[j-1]>t)
{
a[j]=a[j-1];
j--;
}
}
a[j]=t;
}
若待排序的序列中,存在多个具有相同关键字的记录,经过排序, 这些记录的相对次序保持不变,则称该算法是稳定的;
若经排序后,记录的相对 次序发生了改变,则称该算法是不稳定的。
假定在待排序的记录序列中,存在多个具有相同键值的记录,若经过排序,这些记录的相对次序保持不变,
即在原序列中,ki=kj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。
快速排序、希尔排序、堆排序、选择排序不是稳定的排序算法,
而基数排序、冒泡排序、插入排序、归并排序是稳定的排序算法
冒泡、插入、选择是简单排序,平均复杂度为O(n^2)
快速排序的最坏情况是排好序的情况,与其它排序算法不同。
简单排序中,插入排序的复杂度与初态有关,另外两个无关。
插入排序可能在最后一趟之前,所有元素都不在最终位置。
选择、快速排序不稳定,其它稳定。
4、快速排序
快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比
另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
void sort(int a[],int start,int end)
{
int i=start,j=end;
while(i<j)
{
while(i<j && a[i]<=a[j])
j--;
if(i<j)
{
int t=a[i];
a[i]=a[j];
a[j]=t;
}
while(i<j&& a[i]<[j])
i++;
if(i<j)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
if(i-start>1)
{ //递归调用,把key前面的完成排序
sort(a,0,i-1);
}
if(end-j>1)
{
sort(a,j+1,end); //递归调用,把key后面的完成排序
}
}}
如果是字符串的比较,在java中可以用compareTo方法比较
String a="b123";
String b="b124";
String d="b122";
String e="b123";
int c=a.compareTo(b);
System.out.println(c);//-1
c=a.compareTo(d);
System.out.println(c);//1
c=a.compareTo(e);
System.out.println(c);//0