各类排序算法

来源:互联网 发布:湖南大学软件培训中心 编辑:程序博客网 时间:2024/06/06 08:55

1.快速排序

.快速排序(对冒泡排序的改进)设要排序的数组是A[0],...,A[N-1],首先任意选取一个数据(通常选用第一个数)作为关键数据;然后把所有比它小的数都放到它前面,所有比它大的数都放在它后面,这样实现了一趟快速排序。算法步骤:1) 设置两个变量i,j,排序开始的时候:i=0,j=N-1;2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];3) 从j开始向前搜索(j=j-1),找到第一个比key小的值A[j],并与A[i]交换;4)从i开始向后搜索(i=i+1),找到第一个比key大的值A[i],并与A[j]交换;5)重复3,4,5,直到i=j#include "stdafx.h"//快速排序int Partition(int data[], int start, int end){ int X= data[start]; //把第一个元素作为支点  while(start < end) {  //从后向前  while(start<end && data[end]>=X) end--;  data[start] = data[end];  //从前向后  while(start<end && data[start]<=X) start++;  data[end] = data[start];  data[start] = X; } return start;}void QuickSort(int data[], int start, int end){ if(start == end)  return; int index = Partition(data,start,end); if(index >start)  QuickSort(data, start, index-1); if(index < end)  QuickSort(data, index+1, end);}void print(int data[], int length){ for(int i = 0; i < length; i++)  printf("%d ", data[i]); printf("\n");}int _tmain(int argc, _TCHAR* argv[]){ int data[]={72,6,57,88,60,42,83,73,48,85}; print(data,sizeof(data)/sizeof(int)); QuickSort(data,0,sizeof(data)/sizeof(int)-1); print(data,sizeof(data)/sizeof(int)); return 0;}

2.归并排序

#include "stdafx.h"void merge_sort(int* A, int x, int y, int* T){if(y-x > 1){int m = x + (y-x) /2;   //划分int p = x, q = m, i = x;merge_sort(A, x, m, T);  //递归merge_sort(A, m, y, T);while(p < m || q < y){if(q >= y || (p < m && A[p] <= A[q])) T[i++] = A[p++];else T[i++] = A[q++];}for(i = x; i < y; i++) A[i] = T[i];}}//归并排序2(P284)//归并操作void Merge1(int SR[], int TR[], int i, int m, int n) {//将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n]int j,k;for(j = m + 1, k = i; i <= m && j <=n; ++k)if(SR[i] < SR[j])TR[k] = SR[i++];elseTR[k] = SR[j++];while(i<=m)TR[k] = SR[i++];while(j<=n)TR[k] = SR[j++];}void Merge2(int SR[], int TR[], int i, int m, int n) {//将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n]int j,k=n,s;for(s=m,j=n; s >=i && j>=m+1;k--)if(SR[i] < SR[j]) TR[k] = SR[j--];elseTR[k] = SR[s--];while(j>= m+1)TR[k--] = SR[j--];while(s>=i)TR[k--] = SR[s--];}void MSort(int SR[], int TR1[], int s, int t){int m;int TR2[100];  if(s == t){TR1[s] = SR[s];return;}m = (s+t)/2;              //将SR[s..t]平分为SR[s..m]和SR[m+1,..t]MSort(SR, TR2,s,m);       //递归地将SR[s..m]归并为有序的TR2[s..m]MSort(SR, TR2,m+1,t);     //递归地将SR[m+1..t]归并为有序的TR2[m+1,t]Merge2(TR2,TR1,s,m,t);    //将TR2[s..m]和TR2[m+1..t]归并到TR1[s..t]return;}int A[] = { 1,0,2,3,9,7};int n = sizeof(A)/sizeof(int);int T[100];void Test1(){merge_sort(A,0,6,T);for(int i = 0; i < n; i++)printf("%d ", A[i]);printf("\n");}void Test2(){int SR[] = {38,49,65,97,13,27,76}; //[0,3][4,6]int TR[100];Merge2(SR, TR, 0, 3,6) ;for(int i=0; i <7; i++)printf("%d ", TR[i]);printf("\n");}//归并排序void Test3(){int SR[] = {49, 38, 65, 97, 96, 13, 27};int TR[100];MSort(SR,TR,0,6);for(int i=0; i <7; i++)printf("%d ", TR[i]);printf("\n");}int _tmain(int argc, _TCHAR* argv[]){//Test2();Test3();return 0;}

3.冒泡排序

//冒泡排序#include "stdafx.h"void bubble_sort(int a[], int n){bool change;for(int i = n -1, change = true; i >= 1 && change; --i) {change = false;for(int j = 0; j < i; ++j)if(a[j] > a[j+1]){int tmp;tmp =a[j];a[j] = a[j+1];a[j+1] = tmp;change = true;}}}void print(int a[],int n){for(int i=0; i < n; i++)printf("%d ", a[i]);printf("\n");}int _tmain(int argc, _TCHAR* argv[]){int a[] = {4,5,3,2};print(a,4);bubble_sort(a, 4);print(a,4);return 0;}


0 0