冒泡排序:
设数组长度为N,
1、比较相邻前后两个数据,数组为[0,N-1],则要比较N-1次
2、循环一次后,最大或者最小的数在数组最后面,这样比较数组[0,N-2],重复上述步骤即可
综上其就是两个for循环
第一个for循环表示:要排序的数值个数-1
第二个for循环表示:将无序数组进行排序,即比较相邻的两个数值
以下为代码:
// sort.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" void Swap(int &a, int &b) { int temp = a; a = b; b = temp; } void BubbleSort1(int a[], int n) { int i,j; for (i = 0; i < n - 1; i++) { for (j = 0; j < n - i - 1; j++) { if (a[j] > a[j+1]) { Swap(a[j], a[j+1]); } } } for (int i = 0; i < n; i++) { printf("%d\t", a[i]); } } //改进 void BubbleSort2(int a[], int n) { int i, j = n - 1; bool flag = true; //设置标志,如果这一趟发生交换,则为true,否则为false while(flag) { flag = false; for(i = 0; i < j; i++) if (a[i] > a[i+1]) { Swap(a[i], a[i+1]);; flag = true; } j--; } for (int i = 0; i < n; i++) { printf("%d\t", a[i]); } } int _tmain(int argc, _TCHAR* argv[]) { int score[] = {67, 69, 75, 87, 89, 90, 99, 100}; BubbleSort2(score, 8); return 0; }
直接插入排序:
设数组为a[0,n-1];
1、取i = 1,2......n-1,每设置一次i的值,即将数组a[0,i-1]进行排序。
2、这样a[0,n-1]可以分为两个部分,a[0,i-1]为排好序的,而a[i,n-1]为无序。
3、i++直到n-1,即1步骤,即可。
以下是代码:
void InsertSort1(int a[], int n) { int i,j,k; for (i = 1; i < n; i++) //将下标1到n-1进行直接插入排序 { for (j = i-1; j >=0; j--) //当下标为i时,将a[i]排在a[0,i-1]上 { if(a[j] < a[i]) break; } if ( j != i-1 ) //如果j不在i的前一位,即表示将a[i]查到a[0,i-1]之间 { int temp = a[i]; for(k = i - 1; k > j; k--) a[k+1]=a[k]; a[k+1] = temp; } } } //改进直接插入排序 void Insertsort2(int a[], int n) { int i,j; for (i = 1; i < n; i++) if (a[i] < a[i-1]) { int temp = a[i]; for (j = i - 1; j >= 0 && a[j] > temp; j--) { a[j+1] = a[j]; } a[j+1] = temp; } }
希尔排序:
1、将无序数组分割成若干个子序列,子序列的长度(gap = n/2)是相隔特定的增量子序列,将各子序列进行直接插入排序;
2、在排序一次后,将数组再次分割若干子序列,子序列的长度(gap /= 2)是相隔特定的增量子序列,将各子序列进行直接插入排序;
3、重复上述过程,直到gap = 0时,数组排序完成。
以下为代码:
void shellSort1(int a[], int n) { int i,j,gap; //gap为步长 for (gap = n/2; gap > 0; gap /= 2) // 设置步长 for (i = 0; i < gap; i++) //按组排序 { for (j = i + gap; j < n; j += gap) { if (a[j] < a[j-gap]) //如果后面的比前面的小 { int temp = a[j]; int k = j-gap; while (k >= 0 && a[k] > temp) { a[k+gap] = a[k]; k -= gap; } a[k+gap] = temp; } } } } //改进希尔排序 void shellSort2(int a[], int n) { int j,gap; for(gap = n/2; gap > 0; gap /= 2) for(j = gap; j < n; j++) //从数组第gap个元素开始 if (a[j] < a[j-gap]) { int temp = a[j]; int k = j-gap; while (k >= 0 && a[k] > temp) { a[k + gap] = a[k]; k -= gap; } a[k+gap] = temp; } }
归并排序:
先分,在组合,这里是递归算法
代码如下:
void mergeArray(int a[], int first, int mid, int last, int temp[]) { int i = first, j = mid + 1, k = 0; int m = mid, n = last; while (i <= m && j <= n) { if(a[i] < a[j]) temp[k++] = a[i++]; else temp[k++] = a[j++]; } while(i <= m) temp[k++] = a[i++]; while(j <= n) temp[k++] = a[j++]; for (i = 0; i < k; i++) { a[first + i] = temp[i]; } } void mergesort(int a[], int first, int last, int temp[]) { if (first < last) { int mid = (first + last)/2; mergesort(a, first, mid, temp); mergesort(a, mid + 1, last, temp); mergeArray(a, first, mid, last, temp); } } bool MergeSort(int a[], int n) { int* pTempArray = new int[n]; if(pTempArray == NULL) return false; mergesort(a, 0, n-1, pTempArray); delete[] pTempArray; return true; }
快速排序:
1、在数组取一个数作为基数
2、在L在往前查找比基数小的数,然后将此坑与基数的坑对换。
3、在R往后查找比基数大的数,然后将此坑与基数的坑对换。
4、知道LR相等时,将基数放置在L或者R处。
以下为代码:
void quickSort(int a[], int L, int R) { if( L < R ) { int i = L, j = R, x = a[L]; while (i < j) { while ( i < j && a[j] >= x) j--; if(i < j) a[i++] = a[j]; while (i < j && a[i] < x) i++; if(i < j) a[j--] = a[i]; } a[i] = x; quickSort(a, L, i-1); quickSort(a,i+1, R); } }
---------------------------------------------------------------------------
java实现:
package com.example.sorts; public class sorts { //冒泡排序 public static void bubbleSort(int[] arr){ int i, j; int len = arr.length; int temp; for(i = 0; i < len - 1; i++) for(j = 0; j < len - 1 - i; j++){ if(arr[j] > arr[j+1]){ temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } //直接插入排序 public static void insertSort(int[] arr){ int i, j; int len = arr.length; int temp; for(i = 1; i < len; i++) if(arr[i] < arr[i-1]){ temp = arr[i]; for(j = i - 1; j >= 0 && arr[j] > temp; j--) arr[j+1] = arr[j]; arr[j+1] = temp; } } //希尔排序 public static void shellSort(int[] arr){ int i, j; int gap; //间隔 int len = arr.length; int temp; for(gap = len/2; gap > 0; gap /= 2) for(i = gap; i < len; i++) if(arr[i] < arr[i-gap]){ temp = arr[i]; for(j = i - gap; j >= 0 && arr[j] > temp; j -= gap) arr[j+gap] = arr[j]; arr[j+gap] = temp; } } //直接选择排序 public static void selectSort(int[] arr){ int i, j; int len = arr.length; int temp; int nMinIndex; for(i = 0; i < len; i++){ nMinIndex = i; for(j = i + 1 ; j < len ; j++) if(arr[nMinIndex] > arr[j]) nMinIndex = j; temp = arr[nMinIndex]; arr[nMinIndex] = arr[i]; arr[i] = temp; } } //归并排序 public static void mergeSort(int[] arr, int low, int high){ int mid = (low + high)/2; if(low < high){ mergeSort(arr, low, mid); mergeSort(arr, mid+1, high); merge(arr, low, mid, high); } } public static void merge(int[] arr, int low, int mid, int high){ int[] temp = new int[high-low+1]; int i = low; //数组1的起始点 int j = mid+1; //数组2的起始点 int k = 0; while(i <= mid && j <= high){ if(arr[i] < arr[j]){ temp[k++] = arr[i++]; }else{ temp[k++] = arr[j++]; } } while(i <= mid){ temp[k++] = arr[i++]; } while(j <= high){ temp[k++] = arr[j++]; } for(int m = 0; m < temp.length; m++) arr[low+m] = temp[m]; } //快速排序 public static void quickSort(int[] arr, int L, int R){ if(L < R){ int i = L, j = R; //选定基数 int x = arr[i]; while(i < j){ while(i < j && arr[j] >= x) j--; if(i < j) arr[i++] = arr[j]; while(i < j && arr[i] < x) i++; if(i < j) arr[j--] = arr[i]; } arr[i] = x; quickSort(arr, L, i-1); quickSort(arr, i+1, R); } } //堆排序 public static void MinHeapSort(int[] arr, int n){ int temp; //建立最小堆 MakeMinHeap(arr, n); for(int i = n - 1; i >= 0; i--){ temp = arr[i]; arr[i] = arr[0]; arr[0] = temp; MinHeapFixdown(arr, 0, i); } } public static void MinHeapFixdown(int[] arr, int i, int n){ //i表示节点,n表示节点数 int j; //子节点 int temp = arr[i];//将父节点值保存到temp j = 2*i + 1; while(j < n){ if(j + 1 < n && arr[j+1] < arr[j]) j++; if(temp <= arr[j]) break; arr[i] = arr[j]; i = j; //将子节点设置为父节点 j = 2*i + 1; //得到父节点的子节点 } arr[i] = temp; } //建立最小堆 public static void MakeMinHeap(int[] arr, int n){ for(int i = n/2 - 1; i >= 0; i--) MinHeapFixdown(arr, i, n); } public static void main(String[] args){ int[] arrI = {9, 12, 17, 30, 50, 20, 60, 65, 4, 49}; MinHeapSort(arrI, 10); for(int k : arrI) System.out.print(k+" "); } }