选择排序
在每一次循环中找到最小的值,将该值的索引赋值给minPos,都找完之后将该值和i所对应的值做交换
public class demo1 {
public static void main(String[] args) {
int[] arr = {5,3,6,8,1,7,9,4,2};
for(int i=0;i<arr.length-1;i++){
int minPos = i;
for(int j=i+1;j<arr.length;j++){
if(arr[j]<arr[minPos]){
minPos = j;
}
}
int temp = arr[i];
arr[i] = arr[minPos];
arr[minPos] = temp;
}
for (int i : arr) {
System.out.print(i+" ");
}
}
}
冒泡排序
public class demo1 {
public static void main(String[] args) {
int[] arr = {5,3,6,8,1,7,9,4,2};
for(int i=arr.length-1;i>0;i--){
for(int j=0;j<i;j++){
if(arr[j]>arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
for (int i : arr) {
System.out.print(i+" ");
}
}
}
插入排序
从下标为一的元素开始,和它之前的元素进行比较,如果较小,则交换位置
public class demo1 {
public static void main(String[] args) {
int[] arr = {5,3,6,8,1,7,9,4,2};
for(int i=1;i<arr.length;i++){
for(int j=i;j>0;j--){
if(arr[j]<arr[j-1]){
int temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
}
}
}
for (int i : arr) {
System.out.print(i+" ");
}
}
}
希尔排序(改进的插入排序)
首先给定数组一个间隔,从0开始根据间隔取得相对应的元素,把这些元素使用插入排序排好顺序;之后再到下标为1的元素,也根据相同的间隔进行取值排序,依此类推。在所有的元素都排过顺序后,再取一个新的间隔,一般为第一个间隔的一半重复操作;最后一定要以间隔为一再排一次
比如首先以间隔为4进行排序
得到[1,6,2,3,5,12,8,4,9,13,11,7,10,15,14]
之后再以间隔为2进行排序
最后以间隔为一排序一次
代码实现
第一种
public class demo1 {
public static void main(String[] args) {
int[] arr = {5,3,6,8,1,7,9,4,2,10,16,12,15};
for(int gap=arr.length/2;gap>0;gap/=2){//首先以数组长度的一半作为初始间隔
for(int i=gap;i<arr.length;i++){
for(int j=i;j>gap-1;j-=gap){
if(arr[j]<arr[j-gap]){
int temp = arr[j];
arr[j] = arr[j-gap];
arr[j-gap] = temp;
}
}
}
}
for (int i : arr) {
System.out.print(i+" ");
}
}
}
第二种(效率更高一些)
public class demo1 {
public static void main(String[] args) {
int[] arr = {5,3,6,8,1,7,9,4,2,10,16,12,15};
int h=1;
while (h<arr.length/3){
h=h*3+1;
}
for(int gap=h;gap>0;gap=(gap-1)/3){
for(int i=gap;i<arr.length;i++){
for(int j=i;j>gap-1;j-=gap){
if(arr[j]<arr[j-gap]){
int temp = arr[j];
arr[j] = arr[j-gap];
arr[j-gap] = temp;
}
}
}
}
for (int i : arr) {
System.out.print(i+" ");
}
}
}
快速排序(分为单轴快排和双轴快排)
单轴快排
以数组中某个元素作为轴点,把所有比它小的元素移动到轴点的左边,把所有比它大的元素移动到轴点的右边;注意这时候左右两边的元素还是无序的,只是把数组分成了两部分;分好之后,再对左右两个分区按照同样的运算规则再次进行排序,一直分到只剩一个为止
代码实现
public class demo1 {
public static void main(String[] args) {
int[] arr = {5,3,6,8,1,7,15,4,2,10,16,12,9};
sort(arr,0,arr.length-1);
for (int i : arr) {
System.out.print(i+" ");
}
}
public static void sort(int[] arr,int leftBound,int rightBound){
if(leftBound>=rightBound){
return;
}
int pivot = arr[rightBound];//轴点
int left = leftBound;//从0开始
int right = rightBound-1;//从数组的倒数第二位开始
while (left<=right){
while (left<=right && arr[left]<=pivot) left++;//找到比轴点大的元素时停止
while (left<=right && arr[right]>pivot) right--;//找到比轴点小的元素时停止
//交换位置
if(left<right){
swap(arr,left,right);
}
}
//把轴点放到中间
swap(arr,left,rightBound);
//这时候left表示中间值
int mid = left;
sort(arr,leftBound,mid-1);
sort(arr,mid+1,rightBound);
}
public static void swap(int[] arr,int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}