选择排序
原理:对于n个数,进行n-1次排序,每次扫描,找出最大(最小)放到数列的指定位置。
代码:
void select_sort(int arr[]){
int max,index; //最大值及其下标
for (int i=0; i<arr.length-1; i++){
max = arr[i]; //每次遍历前max 和 index的设置
index = i;
for (int j=i+1; j<arr.length; j++){
if (arr[j] > max){
max = arr[j];
index = j;
}
}
arr[index] = arr[i];
arr[i] = max;
}
}
直接插入排序
原理:对于n个数,进行n-1次排序,每一次将一个待排序的第一个数按其大小插入到前面已排好序的数组的适当位置,直到对象全部插入为止。
代码:
第一种(未排序的数组第一个数加入已排好序的数组尾部组成一个临时数组,然后从临时数组尾部开始比较相邻数字,如果前面数字大于后面数字就交换位置,直到临时数组都比较)(优先选择)。
public static void insert_sort(int[] number) {
int n = number.length;
int temp;
for(int i = 1; i< n; i++) {
for(int j = i; j>0 && number[j-1] > number[j]; j--) {
temp = number[j];
number[j] = number[j-1];
number[j-1] = temp;
}
}
}
第二种(记录未排序的数组第一个数应插入的位置index, 然后数组从index向后移动一位直到刚刚未排序的第一个数的位置(不包含这位))
public static void insert_sort(int[] number) {
int index;
int temp;
for(int i = 1; i< number.length; i++) {
index=i;
for(int j=0; j<i;j++){
if(number[i]<number[j]){
index=j;
break;
}
}
if(index != i){
temp=number[i];
for(int k=i;k>index;k--){
number[k]=number[k-1];
}
number[index] = temp;
}
}
}
冒泡排序
原理:对于n个数,进行n-1次排序,每次扫描通过相邻两个数的比较,找出最大(最小)放到数列的顶部(尾部)。
代码:
void bubble_sort(int[] arr){
int temp;
for(int i=1;i<arr.length;i++){
for(int j = 0; j<arr.length-i;j++){ //从头向尾扫描,把最大(最小)的放到尾部
if(arr[j]>arr[j+1]){ //‘>’把最大的放到顶部(尾部)、‘<’把最小的放到顶部(尾部)
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
快速排序
原理:对于n个数,在其中选择一个中心值key(进行快排序的第一个数就可以作为key值,简单且防重复),从数组的第一个数Ai 从左往右找,找到第一个大于key的数,记为Ai,从数组的最后一个数Aj从右往左找,找到第一小于key的数,记为Aj,交换Ai 和Aj ,重复这个过程,直到 i=j(),调整key的位置,把A[i] 和key交换,其中以key为中心,key右边都比key大,key左边的都key小,然后对这两部分分别重复这个过程,直到整个有序。
代码:
public static void quick_sort(int[] arr, int low, int high) {
if( low > high) { //递归算法的出口
return;
}
int i = low;
int j = high;
int key = arr[ low ];
while( i< j) {
while(i<j && arr[j] > key){ //从右往左找到第一个小于key的数
j--;
}
while( i<j && arr[i] <= key) { //从左往右找到第一个大于key的数
i++;
}
if(i<j) { // 交换
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
int temp = arr[i];
arr[i] = arr[low];
arr[low] = temp; // 调整key的位置
quick_sort(arr, low, i-1 ); // 对key左边的数快排
quick_sort(arr, i+1, high); //对key右边的数快排
}