收藏 分销(赏)

数据结构课程设计之java排序.doc

上传人:二*** 文档编号:4571407 上传时间:2024-09-30 格式:DOC 页数:23 大小:121.54KB 下载积分:5 金币
下载 相关 举报
数据结构课程设计之java排序.doc_第1页
第1页 / 共23页
本文档共23页,全文阅读请下载到手机保存,查看更方便
资源描述
《数据结构课程设计》 专业:计算机科学与技术 姓名:周兵 学号: 一、 需求分析 一、设计代码: 1. 直接插入排序: public class InsertSort { public static <T extends Comparable<? super T>> void insertSort(T[] array) { for (int i = 1; i <= array.length - 1; i++) { int j = i; while (j>=1 && array[j].compareTo(array[j - 1]) < 0) { T temp = array[j]; array[j] = array[j - 1]; array[j - 1] = temp; j--; } } } public static void main(String[] args) { Integer[] testArray = {23, 25, 12, 42, 35,33,43,57}; System.out.println("排序前 :"); for (Integer item : testArray) { System.out.print(item); System.out.print(' '); } System.out.println(); System.out.println("-------------------"); InsertSort.insertSort(testArray); System.out.println("排序后 :"); for (Integer item : testArray) { System.out.print(item); System.out.print(' '); } } } 实验结果: 2. 折半插入排序: public class BInsertSort { public static void bInsertSort(int[] temp) { int length = temp.length; for (int i = 1; i < length; i++) { int tempVal = temp[i]; int low = 0; int high = i - 1; while (low <= high) { int middle = (low + high) / 2; if (tempVal < temp[middle]) high = middle - 1; else low = middle + 1; } for (int j = i; j > high + 1; j--) temp[j] = temp[j - 1]; temp[high + 1] = tempVal; } } public static void main(String[] args) { int[] a = { 5, 1, 76, 2, 4, 84, 36, 22, 62, 90 }; bInsertSort(a); System.out.println("排序后:"); for (int i = 0; i < a.length; i++) System.out.print(a[i] + " "); } } 实验结果: 3. 希尔排序: public class InsertionSort { public void shellInertionSort(double [] sorted, int inc){ int sortedLen= sorted.length; for(int j=inc+1;j<sortedLen;j++ ){ if(sorted[j]<sorted[j-inc]){ sorted[0]= sorted[j];//先保存一下后面的那个 int insertPos=j; for(int k=j-inc;k>=0;k-=inc){ if(sorted[k]>sorted[0]){ sorted[k+inc]=sorted[k]; if(k-inc<=0){ insertPos = k; } }else{ insertPos=k+inc; break; } } sorted[insertPos]=sorted[0]; } } } public void shellInsertionSort(double [] sorted){ int[] incs={7,5,3,1}; int num= incs.length; int inc=0; for(int j=0;j<num;j++){ inc= incs[j]; shellInertionSort(sorted,inc); } } public static void main(String[] args) { Random random= new Random(6); int arraysize= 21; double [] sorted=new double[arraysize]; System.out.print("Before Sort:"); for(int j=1;j<arraysize;j++){ sorted[j]= (int)(random.nextDouble()* 100); System.out.print((int)sorted[j]+" "); } System.out.println(); InsertionSort sorter=new InsertionSort(); sorter.shellInsertionSort(sorted); System.out.print("After Sort:"); for(int j=1;j<sorted.length;j++){ System.out.print((int)sorted[j]+" "); } System.out.println(); } } 实验结果: 4. 冒泡排序: public class BubbluSort { public static void sortiere(int[] x) { boolean unsortiert = true; int temp; while (unsortiert) { unsortiert = false; for (int i = 0; i < x.length - 1; i++) if (x[i] > x[i + 1]) { temp = x[i]; x[i] = x[i + 1]; x[i + 1] = temp; unsortiert = true; } } } public static void main(String[] args) { int[] liste = { 0, 9, 4, 6, 2, 8, 5, 1, 7, 3 }; System.out.println("排序前:"); for (int i = 0; i < liste.length; i++) System.out.print(liste[i] + " "); System.out.println(); System.out.println("-----------------------------"); System.out.println("排序后:"); sortiere(liste); for (int i = 0; i < liste.length; i++) System.out.print(liste[i] + " "); } } 实验结果: 5. 快速排序: public class ExchangeSort { public void QuickExchangeSortBackTrack(double[] sorted, int low, int high) { if (low < high) { int pivot = findPivot(sorted, low, high); QuickExchangeSortBackTrack(sorted, low, pivot - 1); QuickExchangeSortBackTrack(sorted, pivot + 1, high); } } public int findPivot(double[] sorted, int low, int high) { sorted[0] = sorted[low]; while (low < high) { while (low < high && sorted[high] >= sorted[0]) --high; sorted[low] = sorted[high]; while (low < high && sorted[low] <= sorted[0]) ++low; sorted[high] = sorted[low]; } sorted[low] = sorted[0]; return low; } public static void main(String[] args) { Random random = new Random(6); int arraysize = 10; double[] sorted = new double[arraysize]; System.out.println("排序前:"); for (int j = 1; j < arraysize; j++) { sorted[j] = (int) (random.nextDouble() * 100); System.out.print((int) sorted[j] + " "); } System.out.println(); System.out.println("------------------------------"); ExchangeSort sorter = new ExchangeSort(); sorter.QuickExchangeSortBackTrack(sorted, 1, arraysize - 1); System.out.println("排序后:"); for (int j = 1; j < sorted.length; j++) { System.out.print((int) sorted[j] + " "); } System.out.println(); } } 实验结果: 6. 直接选择排序: public class SelectionSort { public void straitSelectionSort(double [] sorted){ int sortedLen= sorted.length; for(int j=1;j<sortedLen;j++){ int jMin= getMinIndex(sorted,j); exchange(sorted,j,jMin); } } public void exchange(double [] sorted,int i,int j){ int sortedLen= sorted.length; if(i<sortedLen && j<sortedLen && i<j && i>=0 && j>=0){ double temp= sorted[i]; sorted[i]=sorted[j]; sorted[j]=temp; } } public int getMinIndex(double [] sorted, int i){ int sortedLen= sorted.length; int minJ=1; double min= Double.MAX_VALUE; for(int j=i;j<sortedLen;j++){ if(sorted[j]<min){ min= sorted[j]; minJ= j; } } return minJ; } public static void main(String [] args){ Random random= new Random(6); int arraysize=9; double [] sorted=new double[arraysize]; System.out.println("排序前:"); for(int j=1;j<arraysize;j++){ sorted[j]= (int)(random.nextDouble()* 100); System.out.print((int)sorted[j]+" "); } System.out.println(); System.out.println("------------------------"); SelectionSort sorter=new SelectionSort(); sorter.straitSelectionSort(sorted); System.out.println("排序后:"); for(int j=1;j<sorted.length;j++){ System.out.print((int)sorted[j]+" "); } System.out.println(); } } 实验结果: 7. 堆排序: public class SelectionSort { public void heapAdjust(double [] sorted,int start,int end){ if(start<end){ double temp= sorted[start]; for(int j=2*start;j<end;j *=2){ if(j+1<end && sorted[j]-sorted[j+1]>10e-6){ ++j; } if(temp<=sorted[j]){ break; } sorted[start]=sorted[j]; start=j; } sorted[start]=temp; } } public void exchange(double [] sorted,int i,int j){ int sortedLen= sorted.length; if(i<sortedLen && j<sortedLen && i<j && i>=0 && j>=0){ double temp= sorted[i]; sorted[i]=sorted[j]; sorted[j]=temp; } } public void heapSelectionSort(double [] sorted){ int sortedLen = sorted.length; for(int i=sortedLen/2;i>0;i--){ heapAdjust(sorted,i,sortedLen); } for(int i=sortedLen;i>1;--i){ exchange(sorted,1,i); heapAdjust(sorted,1,i-1); } } public static void main(String [] args){ Random random= new Random(6); int arraysize=10; double [] sorted=new double[arraysize]; System.out.println("排序前:"); for(int j=1;j<arraysize;j++){ sorted[j]= (int)(random.nextDouble()* 100); System.out.print((int)sorted[j]+" "); } System.out.println(); System.out.println("------------------------"); SelectionSort sorter=new SelectionSort(); sorter.heapSelectionSort(sorted); System.out.println("排序后:"); for(int j=1;j<sorted.length;j++){ System.out.print((int)sorted[j]+" "); } System.out.println(); } } 实验结果: 8. 归并排序: public class MergeSort { private double[] bridge;//辅助数组 public void sort(double[] obj){ if (obj == null){ throw new NullPointerException("The param can not be null!"); } bridge = new double[obj.length]; // 初始化中间数组 mergeSort(obj, 0, obj.length - 1); // 归并排序 bridge = null; } private void mergeSort(double[] obj, int left, int right){ if (left < right){ int center = (left + right) / 2; mergeSort(obj, left, center); mergeSort(obj, center + 1, right); merge(obj, left, center, right); } } private void merge(double[] obj, int left, int center, int right){ int mid = center + 1; int third = left; int tmp = left; while (left <= center && mid <= right){ if (obj[left]-obj[mid]<=10e-6){ bridge[third++] = obj[left++]; } else{ bridge[third++] = obj[mid++]; } } while (mid <= right){ bridge[third++] = obj[mid++]; } while (left <= center){ bridge[third++] = obj[left++]; } // 将中间数组的内容拷贝回原数组 copy(obj, tmp, right); } private void copy(double[] obj, int left, int right){ while (left <= right){ obj[left] = bridge[left]; left++; } } public static void main(String[] args) { Random random = new Random(6); int arraysize = 10; double[] sorted = new double[arraysize]; System.out.println("排序前:"); for (int j = 0; j < arraysize; j++) { sorted[j] = (int) (random.nextDouble() * 100); System.out.print((int) sorted[j] + " "); } System.out.println(); System.out.println("--------------------------"); MergeSort sorter = new MergeSort(); sorter.sort(sorted); System.out.println("排序后:"); for (int j = 0; j < sorted.length; j++) { System.out.print((int) sorted[j] + " "); } System.out.println(); } } 实验结果: 9. 基数排序: public class RadixSort { private int keyNum=-1; private Vector<Vector<Double>> util; public void distribute(double [] sorted, int nth){ if(nth<=keyNum && nth>0){ util=new Vector<Vector<Double>>(); for(int j=0;j<10;j++){ Vector <Double> temp= new Vector <Double>(); util.add(temp); } for(int j=0;j<sorted.length;j++){ int index= getNthDigit(sorted[j],nth); util.get(index).add(sorted[j]); } } } public int getNthDigit(double num,int nth){ String nn= Integer.toString((int)num); int len= nn.length(); if(len>=nth){ return Character.getNumericValue(nn.charAt(len-nth)); }else{ return 0; } } public void collect(double [] sorted){ int k=0; for(int j=0;j<10;j++){ int len= util.get(j).size(); if(len>0){ for(int i=0;i<len;i++){ sorted[k++]= util.get(j).get(i); } } } util=null; } public int getKeyNum(double [] sorted){ double max= Double.MIN_VALUE; for(int j=0;j<sorted.length;j++){ if(sorted[j]>max){ max= sorted[j]; } } return Integer.toString((int)max).length(); } public void radixSort(double [] sorted){ if(keyNum==-1){ keyNum= getKeyNum(sorted); } for(int i=1;i<=keyNum;i++){ distribute(sorted,i); collect(sorted); } } public static void main(String[] args) { Random random = new Random(6); int arraysize = 10; double[] sorted = new double[arraysize]; System.out.println("排序前:"); for (int j = 0; j < arraysize; j++) { sorted[j] = (int) (random.nextDouble() * 100); System.out.print((int) sorted[j] + " "); } System.out.println(); System.out.println("--------------------------------"); RadixSort sorter = new RadixSort(); sorter.radixSort(sorted); System.out.println("排序后:"); for (int j = 0; j < sorted.length; j++) { System.out.print((int) sorted[j] + " "); } System.out.println(); } } 实验结果: 二、课程设计总结 通过这次课程设计,加深了我对《数据结构》这门功课的结识,更加加深了我对程序算法的理解。我觉得课程设计这种形式是我们真正需要的,可以让我们学到很多,涉及书上的、书外的。而有一句话给我的体会是最深的,就是 理论!=实际。在学排序算法的时候,读了书上的算法描述,觉得自己都会了,考试的题目也做出来了,但真的到编程去实现的时候,却不是一次就能成功的,总会出点差错,等到程序终于能运营的时候,才真正体会到这些算法的精髓。理论和实际永远相差那么一点,不去实现是体会不出来的。 在这里,当然还要感谢知道指导老师的辛勤教导,让我对《数据结构》有了更深的体会和理解,让我知道了怎么在实践中去应用算法,算法给程序带来的好处与效率等等。再次感谢老师的教导!
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服