您的位置:首页 > 其它

排序——(冒泡,选择,插值)

2016-07-22 15:09 204 查看
假设含有n个记录的序列为(r1,r2,.......,rn),其相应的关键字分别为{k1,k2,......,kn},需确定1,2,.....,n的一种排列p1,p2,.......,pn,使其相应的关键字满足kp1<=kp2<=.......<=kpn(非递减或非递增)关系,即使得序列称为一个按关键字有序的序列(rp1,rp2,....rpn),这样的操作就称为排序。

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。

快速排序、希尔排序、堆排序、直接选择排序不是稳定的排序算法,而基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。

①冒泡排序

它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

算法思路比较简单,常用的排序算法,冒泡排序就是把小的元素往前调或者把大的元素往后调。

原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,忽略最后一位将剩下的序列重复上面的操作,直到只剩第一位为止。

public static void bubbleSort(int[] arr) {
for(int i=arr.length-1;i>0;i--) {
for(int j=0;j<i;j++) {
if(arr[j]>arr[j+1]) {
arr[j+1]=arr[j+1]^arr[j];
arr[j]=arr[j+1]^arr[j];
arr[j+1]=arr[j+1]^arr[j];
}
}
}
}


②选择排序

选择排序(Selection
sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

从所有序列中先找到最小(最大)的,然后放到第一个位置。之后再看剩余元素中最小(最大)的,放到第二个位置……知道序列末尾为止。

public static void selectSort(int[] arr) {
int midd;
for(int i=0;i<arr.length-1;i++) {
midd = i;
for(int j=i+1;j<arr.length;j++) {
if(arr[i]>arr[j]) {
midd=j;
}
}
if(midd!=i) {
arr[i]=arr[i]^arr[midd];
arr[midd]=arr[i]^arr[midd];
arr[i]=arr[i]^arr[midd];
}
}
}


③插值排序

所谓插入排序法,就是检查第i个数字,如果在它的左边的数字比它大,进行交换,这个动作一直继续下去,直到这个数字的左边数字比它还要小,就可以停止了。

public static void insertSort(int arr[]) {
int j;
int temp;
for(int i=1;i<arr.length;i++) {
j=i-1;
temp=arr[i];
while(j>=0 && temp<arr[j]) {
arr[j+1]=arr[j];
j--;
}
arr[j+1]=temp;
}
}


④希尔排序

参见另外一篇博客:希尔排序

⑤堆排序

参见另外一篇博客:堆排序

⑥快速排序

参见另外一篇博客:快速排序

⑦归并排序

参见另外一篇博客:归并排序
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: