三种简单的排序算法

排序算法总是分不清,借了本数据结构来专门看了一下

说一下分类,主要有五类,插入排序,交换排序,选择排序,基数排序和归并排序

今天中午看了一下插入排序中的直接插入排序,交换排序的冒泡排序,选择排序中的冒泡排序

1.插入排序

将数组分成两个部分,一个是有序,一个是无序。将无序的每个元素插入到有序中,一共需要n - 1趟,最后一个元素不用计算

每一趟将第1个元素即array[i]元前面的i个元素比较,如果比array[i]大则后移一个位置。这样找到第i个元素的位置,插入

2.冒泡排序

将相邻两个元素比较,后一个元素i + 1比前一个元素i大交换位置。这样每一趟下来最大的就沉到最后一个元素的位置了。

所以需要n - 1趟,中间考虑到有正序的时候,设置一个标志,如果没有交换说明已经是正序,不用在排序了。

具体细节代码中有说明

3.直接选择排序

每一次从数组中选一个最小值放到最前面

这样需要n - 1趟,平时比较喜欢用这个,简单,但是效率不高

Rec.java

 1 package com.gxf.sort;
 2
 3 /**
 4  * 将关键字封装一下
 5  * @author xiangfei
 6  *
 7  */
 8 public class Rec {
 9     int key;
10
11     public Rec(int key){
12         this.key = key;
13     }
14     public Rec(){
15
16     }
17
18     /**
19      * 根据整型数组构造一个Rec[]数组
20      * @param array
21      * @return
22      */
23     public Rec[] getRecArray(int array[]){
24         Rec rec[] = new Rec[array.length];
25         for(int i = 0; i < array.length; i++){
26             rec[i] = new Rec(array[i]);
27         }
28
29         return rec;
30     }
31 }

Sort.java

 1 package com.gxf.sort;
 2
 3 /**
 4  * 排序类
 5  * 这里主要实现三类简单的排序算法
 6  * 直接插入排序、交换排序和选择排序中的
 7  * 直接插入排序、冒泡排序和直接选择排序
 8  * @author xiangfei
 9  *
10  */
11 public class Sort {
12     /**
13      * 直接插入排序算法
14      * 将后面的元素插入到前面的有序队列中n - 1趟
15      * 每一趟需要将比rec[i].key更大的元素后移,找出合适的位置
16      * 这里第一个元素不放值,用于暂存
17      * 开始将第一个元素作为有序队列
18      * @param rec
19      */
20     public void insSort(Rec rec[]){
21         //rec[0]不放值
22         for(int i = 1; i < rec.length;i++){
23             int value = rec[i].key;//需要插入的元素
24             rec[0].key = rec[i].key;//这里需要保存要插入的元素,后面移动元素会覆盖
25             int j = i - 1;
26             while(value < rec[j].key){//后移元素,找到比value小或者等于的
27                 rec[j + 1].key = rec[j].key;
28                 j--;//前移
29             }//j为比rec[i]小或者等于的元素的位置
30             rec[j + 1].key = rec[0].key;//插入,完成一趟插入
31         }
32         //排完序后第一个元素置为0
33         rec[0].key = 0;
34     }
35
36     /**
37      * 冒泡排序
38      * 每一趟比较两个相邻元素的大小,大的元素往后移动,最大的元素移动到最后
39      * 这样最多需要n - 1趟
40      * 如果有正序的则不用排序,需要设置一个标志位,表明是否有交换
41      * @param rec
42      */
43     public void bubbSort(Rec rec[]){
44         boolean flag_exchange = false;//默认没有交换
45         //这里至少需要n - 1趟
46         for(int i = 0; i < rec.length - 1; i++){
47             flag_exchange = false;//重置标志位没有交换
48             for(int j = 0; j < rec.length - i - 1; j++){//每一趟的排序,范围逐渐缩小
49                 if(rec[j].key > rec[j + 1].key){//前一个元素比后一个元素大,需要交换
50                     Rec temp = rec[j];
51                     rec[j] = rec[j + 1];
52                     rec[j + 1] = temp;//交换
53                     flag_exchange = true;//设置有交换
54                 }
55             }
56             if(!flag_exchange)
57                 break;//没有交换,说明已经是正序,退出
58         }
59     }
60
61     /**
62      * 直接选择排序
63      * 每次选出最小的放到最前面,需要n - 1趟
64      * 每一趟从剩下的元素中选出最小的,放到最前面
65      * @param rec
66      */
67     public void seleSort(Rec rec[]){
68         //需要n - 1趟排序
69         for(int i = 0; i < rec.length - 1;i++){
70             int min = i;//最小值的下标,默认为第一个元素
71             //从i ~ n - 1中找出最小的一个元素下标
72             for(int j = i; j < rec.length; j++){
73                 if(rec[j].key < rec[min].key)
74                     min = j;//更新最小元素的下标
75             }//找出最小元素的下标
76             if(i != min){//如果最小元素不是第一个元素交换
77                 Rec temp = rec[min];
78                 rec[min] = rec[i];
79                 rec[i] = temp;
80             }//交换完成
81         }
82     }
83
84     /**
85      * 这里用一个方法来show数组里面的内容,看一下排序是否正确
86      * @param rec
87      */
88     public void showRec(Rec rec[]){
89         for(int i = 0; i < rec.length; i++){
90             System.out.print(rec[i].key + " ");
91         }
92         System.out.println();
93     }
94
95 }

Test.java

package com.gxf.sort;

public class Test {
    public static void main(String args[]){
        Sort sort = new Sort();
        Rec rec = new Rec();
        int array[] = new int[]{0, 32, 1, 34, 54, 5, 6};
        Rec array_test[] = rec.getRecArray(array);
        System.out.println("直接插入排序:");
        sort.showRec(array_test);//print org
        sort.insSort(array_test);
        sort.showRec(array_test);//print changed
        System.out.println("冒泡排序:");
        //bubblesort
        array_test = rec.getRecArray(array);
        sort.showRec(array_test);//print org
        sort.bubbSort(array_test);
        sort.showRec(array_test);//print changed
        System.out.println("直接选择排序:");
        //select
        array_test = rec.getRecArray(array);
        sort.showRec(array_test);//print org
        sort.seleSort(array_test);
        sort.showRec(array_test);//print changed            

    }
}

时间: 2024-10-12 13:36:44

三种简单的排序算法的相关文章

四种简单的排序算法

我觉得如果想成为一名优秀的开发者,不仅要积极学习时下流行的新技术,比如WCF.Asp.Net MVC.AJAX等,熟练应用一些已经比较成熟的技术,比如Asp.Net.WinForm.还应该有着牢固的计算机基础知识,比如数据结构.操作系统.编译原理.网络与数据通信等.有的朋友可能觉得这方面的东西过于艰深和理论化,望而却步,但我觉得假日里花上一个下午的时间,研究一种算法或者一种数据结构,然后写写心得,难道不是一件乐事么?所以,我打算将一些常见的数据结构和算法总结一下,不一定要集中一段时间花费很大精力

四种简单的排序算法的php实现

无聊,用php写几个排序算法,算法介绍请移步这里,这里使用php实现了几个简单的,如下 //选择排序 function selection_sort($arr){ $len = count($arr); if($len <= 1) return $arr; for($i=0; $i<$len; $i++){ $min = $arr[$i]; $pos = $i; for($j=$i+1; $j<$len; $j++){ if($min > $arr[$j]){ $min = $ar

Python实现几种简单的排序算法

一.冒泡排序 概念:为一个无序的列表排成有序的 实现过程描述:(升序) 1.比较相邻的元素,如果第一个比第二个大,就交换他们的位置 2.对每一对相邻元素重复1的工作,从开始第一队到最后一对,最后结束的时候最大的数会在后面 3.针对所有元素重复1,2的工作,除了最后一个数,因为最后的数最大,省略这个过程 4.持续每次对越来越少的元素重复上面的步骤,知道没有任何一对数字需要比较 复杂度: 时间复杂度为O(n^2) 代码实现: #给定一个列表 list = [11,54,3243,323,3,82,1

三种简单的排序写下贴上

void Qsort(int *a,int L,int R) {    if(L>=R) return ;    int p=L,q=R;    int val=a[L];    while(p!=q) {        while(p<q&&a[q]>val) q--;        if(p<q) a[p++]=a[q];        while(p<q&&a[p]<=val) p++;        if(p<q) a[q-

三种简单排序

1.冒泡排序 冒泡排序是一种简单的排序算法,其基本思想如下: 1)从第一个开始起,比较相邻的两个元素的大小,如果前一个比后一个大,则进行交换(也就是小的冒上去). 2)然后再和之前相邻元素进行比较,若小,则冒上去. 2)重复以上操作,直到最后一个元素. 1 public static void BubbleSort(long[] arr){ 2 long tmp = 0; 3 for(int i=0;i<arr.length-1;i++){ 4 for(int j=arr.length-1;j>

面试中常常问的三种简单排序方法

/** * 三种简单的排序 * 本类中全部举例都是依照从小到大进行排序 * @author caohaicheng * @time 2014-07-24 */ public class SortDemo { //int[] score={7,10,35,21,78,2,1,9}; public static void main(String[] args) { SortDemo sd=new SortDemo(); System.out.println("********************

视觉直观感受 7 种常用的排序算法

1. 快速排序 介绍: 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项之可能性. 步骤: 从数列中挑出一个元素,称为 "基准"(pivot), 重新排序数列,所有元

7 种常用的排序算法-视觉直观感受

7 种常用的排序算法-可视化 1. 快速排序 介绍: 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项之可能性. 步骤: 从数列中挑出一个元素,称为 “基准”(pivot),

7 种常用的排序算法直观感受

1. 快速排序 介绍: 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项之可能性. 步骤: 从数列中挑出一个元素,称为 "基准"(pivot), 重新排序数列,所有元