冒泡排序
/**
* 从前往后,依次比较相邻的两个数,把较大的数放到后面。一次循环,可以在当前最末尾位置得到一个当前最大值。
*/
public class orderBy1 {
public static void main(String[] args) {
int score[] = {67, 69, 75, 88};
for(int i =0;i < score.length - 1;i++)
{
for(int j = 0;j < score.length - 1-i;j++)// j开始等于0,
{
if(score[j] < score[j+1])
{
int temp = score[j];
score[j] = score[j+1];
score[j+1] = temp;
}
}
}
for (int i = 0; i <score.length ; i++) {
System.out.println(score[i]);
}
}
}
选择排序
注意选择排序与冒泡排序的区别:
冒泡排序通过依次交换相邻两个顺序不合法的元素位置,从而将当前最小(大)元素放到合适的位置:
而选择排序每遍历一次都记住了当前最小(大)元素的位置,最后仅需一次交换操作即可将其放到合适的位置。
/**
* 从数组中找到最小的元素,和第一个位置的元素互换。
* 从第二个位置开始,找到最小的元素,和第二个位置的元素互换。
* 直到选出array.length-1个较小元素,剩下的最大的元素自动 在最后一位。
*/
public class orderBy2 {
public static void main(String[] args) {
int arr[] = {67, 69, 75, 88};
int minIndex, temp;
for (int i = 0; i < arr.length - 1; i++) {
minIndex = i; //每次都从已排序序列的末尾后一位开始
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) { //寻找最小的数
· minIndex = j; //将最小数的索引保存
}
}
//放到已排序序列的末尾(即交换),该操作很有可能把稳定性打乱,所以选择排序是不稳定的排序算法
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
for (int i = 0; i <arr.length ; i++) {
System.out.println(arr[i]);
}
}
}
插入排序
/**
*从第二个元素开始,将当前元素插入到前面对应位置,使当前元素i
和之前元素形成有序数组。
比较规则:
正常:
从第一个元素开始,若当前元素i小于有序数组中的元素j,则从该元素开始将有序数组依次后移一位,
并将当前元素i放置到该元素j位置。(插入)
简易:
从有序数组最后一个元素开始,若当前元素i小于该元素j,则交换当前元素和该元素。
*/
public class orderBy3 {
public static void main(String[] args) {
int arr[] = {67, 69, 75, 88};
int pos,temp;
for(int i=1;i<arr.length;i++){
pos = i;
while(pos!=0&&arr[pos]<arr[pos-1]){
temp = arr[pos];
arr[pos] = arr[pos-1];
arr[pos-1] = temp;
pos--;
}
}
for (int i = 0; i <arr.length ; i++) {
System.out.println(arr[i]);
}
}
}
快速排序(鸡尾酒排序)
/**
* 鸡尾酒是冒泡排序的升级版,该排序从左往右找出最大值后,再从右往左
找出最小值,类似鸡尾酒搅拌左右循环。在某些情况下,优于冒泡排序,
以序列(67,69,75,88)为例,鸡尾酒排序只需要访问两次(升序降序各一次 )
次序列就可以完成排序,但如果使用冒泡排序则需要四次。
*/
public class orderBy4 {
public static void main(String[] args) {
int arr[] = {67, 69, 75, 88};
//依次将最大的数放置到数组末尾,将第二大的数放到倒数第二位...
boolean changed;
for(int i = 0;i < arr.length/2;i++){
changed = false;
//从前往后,比较相邻两个数,把大的放在后边.之前已放置成功的可以不再参与比较
for(int j = i;j < arr.length-1-i;j++){
if(arr[j]>arr[j+1]) {
swap(arr,j,j+1);
changed =true;
}
}
if(!changed){
break;
}
for(int j = arr.length-1-i; j > i; j--){
if(arr[j]<arr[j-1]) {
swap(arr,j,j-1);
changed = true;
}
}
if(!changed){
break;
}
}
for (int i = 0; i <arr.length ; i++) {
System.out.println(arr[i]);
}
}
public static void swap(int[] arr, int pos1, int pos2){
int temp = arr[pos1];
arr[pos1] = arr[pos2];
arr[pos2] = temp;
}
}