选择排序(以递增排序为例):通过内部循环第一次遍历数组找到最小的元素与数组的第一个元素交换位置,第二次遍历数组找到第二小的元素与数组的第二个元素交换位置,当内存循环找到最小的元素并交换位置后下次遍历时应该避开这个最小元素。这种排序方法对任何结构的数组都是O(n²)的时间复杂度
public static int[] orderBySelect(int[] a){ for(int i=0;i<a.length;i++){ int temp=a[i]; int flag=i; for(int j=i+1;j<a.length;j++){ if(temp>a[j]){ temp=a[j]; flag=j; } } if(flag!=i){ a[flag]=a[i]; a[i]=temp; } } return a; }
插入排序(以递增排序为例):假定第一个元素为最小元素,判定第二个元素与第一元素的大小,如果第二个小于第一个,则交换位置,这时候第一个和第二个已经排好序,通过第三个元素与前面已经排好的第二个元素进行比较,如果大于第二个,则进行下一轮循环、否则交换位置后继续与第一个元素进行比较,外部控制循环到达直到到达数组末端。这种排序方式有个相对于选择排序有个好处就是如果数组本身就已经有部分排好序,则在后面的比较中当与前面已经排好序的最大值进行比较时如果大于最大值的元素就会忽略掉与其他元素的比较,节省了时间
public static int[] orderByInsert(int[] a){ for(int i=1;i<a.length;i++){ int temp=a[i];//保存当前将要用于插入的值 int j=i-1;//用于遍历已经排好序的子集的下标 if(temp<a[j]){//判断子集的最大值与当前的值的大小,如果当前值大,则不需要循环 while(j>=0 && a[j]>temp){//如果子集的元素大于当前值,则修改当前值的位置 a[j+1]=a[j];//将j的位置的值向前移动,用于存放当前值 j--;//进入下一次循环 } a[j+1]=temp;//循环结束后子集中所有大于temp的值都向前移动了一步,这时候j+1的位置就是temp应该插入的位置 } } return a; }
冒泡排序(以递增排序为例):冒泡排序的思想是从左到右(从右到左)进行相邻元素的大小判定,如果后一个元素小于前一个元素,交换位置,一轮循环后最大值将在最右边
public static int[] orderByBubble(int[] a){ for(int i=0;i<a.length;i++){ for(int j=0;j<a.length-i-1;j++){ if(a[j]>a[j+1]){ int temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } } return a; }
归并排序(以递增排序为例):归并
时间: 2024-10-10 15:42:36