一、思路:
插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。
插入排序方法分直接插入排序和折半插入排序两种,
i=1开始递增,{
j=i递减{
a[j]与a[j-1]比较,交换
}
}
二、程序:
static void InsertSort(int a[], int n)
{
int i, j, k;
for(i = 1; i < n; i++) {
System.out.println();
for(j = i; j > 0; j--) {
int data;
if(a[j-1] > a[j]) {
data = a[j];
a[j] = a[j-1];
a[j-1] = data;
}
System.out.print("i="+i+"j="+j+": ");
for(int m=0;m<n;m++){
System.out.print(a[m]+" ");
}
System.out.println();
}
}
}
三、举例:
{5,1,2,4,9,8,7,6,3,0}
i=1j=1: 1 5 2 4 9 8 7 6 3 0
i=2j=2: 1 2 5 4 9 8 7 6 3 0
i=2j=1: 1 2 5 4 9 8 7 6 3 0
i=3j=3: 1 2 4 5 9 8 7 6 3 0
i=3j=2: 1 2 4 5 9 8 7 6 3 0
i=3j=1: 1 2 4 5 9 8 7 6 3 0
i=4j=4: 1 2 4 5 9 8 7 6 3 0
i=4j=3: 1 2 4 5 9 8 7 6 3 0
i=4j=2: 1 2 4 5 9 8 7 6 3 0
i=4j=1: 1 2 4 5 9 8 7 6 3 0
i=5j=5: 1 2 4 5 8 9 7 6 3 0
i=5j=4: 1 2 4 5 8 9 7 6 3 0
i=5j=3: 1 2 4 5 8 9 7 6 3 0
i=5j=2: 1 2 4 5 8 9 7 6 3 0
i=5j=1: 1 2 4 5 8 9 7 6 3 0
i=6j=6: 1 2 4 5 8 7 9 6 3 0
i=6j=5: 1 2 4 5 7 8 9 6 3 0
i=6j=4: 1 2 4 5 7 8 9 6 3 0
i=6j=3: 1 2 4 5 7 8 9 6 3 0
i=6j=2: 1 2 4 5 7 8 9 6 3 0
i=6j=1: 1 2 4 5 7 8 9 6 3 0
i=7j=7: 1 2 4 5 7 8 6 9 3 0
i=7j=6: 1 2 4 5 7 6 8 9 3 0
i=7j=5: 1 2 4 5 6 7 8 9 3 0
i=7j=4: 1 2 4 5 6 7 8 9 3 0
i=7j=3: 1 2 4 5 6 7 8 9 3 0
i=7j=2: 1 2 4 5 6 7 8 9 3 0
i=7j=1: 1 2 4 5 6 7 8 9 3 0
i=8j=8: 1 2 4 5 6 7 8 3 9 0
i=8j=7: 1 2 4 5 6 7 3 8 9 0
i=8j=6: 1 2 4 5 6 3 7 8 9 0
i=8j=5: 1 2 4 5 3 6 7 8 9 0
i=8j=4: 1 2 4 3 5 6 7 8 9 0
i=8j=3: 1 2 3 4 5 6 7 8 9 0
i=8j=2: 1 2 3 4 5 6 7 8 9 0
i=8j=1: 1 2 3 4 5 6 7 8 9 0
i=9j=9: 1 2 3 4 5 6 7 8 0 9
i=9j=8: 1 2 3 4 5 6 7 0 8 9
i=9j=7: 1 2 3 4 5 6 0 7 8 9
i=9j=6: 1 2 3 4 5 0 6 7 8 9
i=9j=5: 1 2 3 4 0 5 6 7 8 9
i=9j=4: 1 2 3 0 4 5 6 7 8 9
i=9j=3: 1 2 0 3 4 5 6 7 8 9
i=9j=2: 1 0 2 3 4 5 6 7 8 9
i=9j=1: 0 1 2 3 4 5 6 7 8 9
快速排序
一、思路:
1)选择一个基准元素,通常选择第一个元素或者最后一个元素,
2)通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大。
3)此时基准元素在其排好序后的正确位置
4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。
二、程序
static void quicksort(int v[], int n,int left, int right){
if(left < right){
int key = v[left];
int low = left;
int high = right;
while(low < high){
while(low < high && v[high] > key){
high--;
}
v[low] = v[high];
while(low < high && v[low] < key){
low++;
}
v[high] = v[low];
print(v,n,left,right);
}
v[low] = key;
print(v,n,left,right);
quicksort(v,n,left,low-1);
quicksort(v,n,low+1,right);
}
}
三、过程(i为left,j为right)
{5,1,2,4,9,8,7,6,3,0}
i=0j=9: 0 1 2 4 9 8 7 6 3 9
i=0j=9: 0 1 2 4 3 8 7 6 8 9
i=0j=9: 0 1 2 4 3 8 7 6 8 9
i=0j=9: 0 1 2 4 3 5 7 6 8 9(5放在了中间)
i=0j=4: 0 1 2 4 3 5 7 6 8 9
i=0j=4: 0 1 2 4 3 5 7 6 8 9
i=1j=4: 0 1 2 4 3 5 7 6 8 9
i=1j=4: 0 1 2 4 3 5 7 6 8 9
i=2j=4: 0 1 2 4 3 5 7 6 8 9
i=2j=4: 0 1 2 4 3 5 7 6 8 9
i=3j=4: 0 1 2 3 3 5 7 6 8 9
i=3j=4: 0 1 2 3 4 5 7 6 8 9 (3放在了左边中间)
i=6j=9: 0 1 2 3 4 5 6 6 8 9
i=6j=9: 0 1 2 3 4 5 6 7 8 9
i=8j=9: 0 1 2 3 4 5 6 7 8 9
i=8j=9: 0 1 2 3 4 5 6 7 8 9
冒泡排序:
一、思路:
从第一个元素开始,对数组中两两相邻的元素比较,将值较小的元素放在前面,值较大的元素放在后面,一轮比较完毕,
一个最大的数沉底成为数组中的最后一个元素,一些较小的数如同气泡一样上浮一个位置。n个数,经过n-1轮比较后完成排序。
两两相邻比较
二、程序
void bubbleSort(int a[], int n){
for(int i =0 ; i< n-1; ++i) {
for(int j = 0; j < n-i-1; ++j) {
if(a[j] > a[j+1])
{
int tmp = a[j] ;
a[j] = a[j+1] ;
a[j+1] = tmp;
}
}
}
}
三、举例
{5,1,2,4,9,8,7,6,3,0}
i=0j=0: 1 5 2 4 9 8 7 6 3 0
i=0j=1: 1 2 5 4 9 8 7 6 3 0
i=0j=2: 1 2 4 5 9 8 7 6 3 0
i=0j=3: 1 2 4 5 9 8 7 6 3 0
i=0j=4: 1 2 4 5 8 9 7 6 3 0
i=0j=5: 1 2 4 5 8 7 9 6 3 0
i=0j=6: 1 2 4 5 8 7 6 9 3 0
i=0j=7: 1 2 4 5 8 7 6 3 9 0
i=0j=8: 1 2 4 5 8 7 6 3 0 9
i=1j=0: 1 2 4 5 8 7 6 3 0 9
i=1j=1: 1 2 4 5 8 7 6 3 0 9
i=1j=2: 1 2 4 5 8 7 6 3 0 9
i=1j=3: 1 2 4 5 8 7 6 3 0 9
i=1j=4: 1 2 4 5 7 8 6 3 0 9
i=1j=5: 1 2 4 5 7 6 8 3 0 9
i=1j=6: 1 2 4 5 7 6 3 8 0 9
i=1j=7: 1 2 4 5 7 6 3 0 8 9
i=2j=0: 1 2 4 5 7 6 3 0 8 9
i=2j=1: 1 2 4 5 7 6 3 0 8 9
i=2j=2: 1 2 4 5 7 6 3 0 8 9
i=2j=3: 1 2 4 5 7 6 3 0 8 9
i=2j=4: 1 2 4 5 6 7 3 0 8 9
i=2j=5: 1 2 4 5 6 3 7 0 8 9
i=2j=6: 1 2 4 5 6 3 0 7 8 9
i=3j=0: 1 2 4 5 6 3 0 7 8 9
i=3j=1: 1 2 4 5 6 3 0 7 8 9
i=3j=2: 1 2 4 5 6 3 0 7 8 9
i=3j=3: 1 2 4 5 6 3 0 7 8 9
i=3j=4: 1 2 4 5 3 6 0 7 8 9
i=3j=5: 1 2 4 5 3 0 6 7 8 9
i=4j=0: 1 2 4 5 3 0 6 7 8 9
i=4j=1: 1 2 4 5 3 0 6 7 8 9
i=4j=2: 1 2 4 5 3 0 6 7 8 9
i=4j=3: 1 2 4 3 5 0 6 7 8 9
i=4j=4: 1 2 4 3 0 5 6 7 8 9
i=5j=0: 1 2 4 3 0 5 6 7 8 9
i=5j=1: 1 2 4 3 0 5 6 7 8 9
i=5j=2: 1 2 3 4 0 5 6 7 8 9
i=5j=3: 1 2 3 0 4 5 6 7 8 9
i=6j=0: 1 2 3 0 4 5 6 7 8 9
i=6j=1: 1 2 3 0 4 5 6 7 8 9
i=6j=2: 1 2 0 3 4 5 6 7 8 9
i=7j=0: 1 2 0 3 4 5 6 7 8 9
i=7j=1: 1 0 2 3 4 5 6 7 8 9
i=8j=0: 0 1 2 3 4 5 6 7 8 9
选择排序:
一、思路:
在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;
然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,
依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。
二、程序
/**
* 选择排序
*/
static void SelectionSort(int[] a, int n){
for (int i = 0; i < n - 1; i++){ //从第一个位置开始
int index = i;
System.out.println("index初始值"+index);
//选出最小的一个数,记录该数所在索引值j,并赋给index
for (int j = i + 1; j < n; j++){ //寻找最小的数据索引
if (a[j] < a[index]){
index = j;
}
}
//如果最小数位置变化则交换,将a[index]与a[i]互换
if (index != i){
int temp = a[index];
a[index] = a[i];
a[i] = temp;
}
System.out.println("index变化值"+index);
for(int m=0;m<n;m++){
System.out.print(a[m]+" ");
}
System.out.println();
}
}
三、举例
{5,1,2,4,9,8,7,6,3,0}
index初始值0 排序前:
5 1 2 4 9 8 7 6 3 0
index变化值9 排序后:
0 1 2 4 9 8 7 6 3 5
index初始值1 排序前:
0 1 2 4 9 8 7 6 3 5
index变化值1 排序后:
0 1 2 4 9 8 7 6 3 5
index初始值2 排序前:
0 1 2 4 9 8 7 6 3 5
index变化值2 排序后:
0 1 2 4 9 8 7 6 3 5
index初始值3 排序前:
0 1 2 4 9 8 7 6 3 5
index变化值8 排序后:
0 1 2 3 9 8 7 6 4 5
index初始值4 排序前:
0 1 2 3 9 8 7 6 4 5
index变化值8 排序后:
0 1 2 3 4 8 7 6 9 5
index初始值5 排序前:
0 1 2 3 4 8 7 6 9 5
index变化值9 排序后:
0 1 2 3 4 5 7 6 9 8
index初始值6 排序前:
0 1 2 3 4 5 7 6 9 8
index变化值7 排序后:
0 1 2 3 4 5 6 7 9 8
index初始值7 排序前:
0 1 2 3 4 5 6 7 9 8
index变化值7 排序后:
0 1 2 3 4 5 6 7 9 8
index初始值8 排序前:
0 1 2 3 4 5 6 7 9 8
index变化值9 排序后:
0 1 2 3 4 5 6 7 8 9